Progsick 0 Denunciar post Postado Outubro 3, 2013 Boa tarde! Gostaria de tirar uma dúvida sobre boas práticas de programação. Tenho um formulário cujo conteúdo eu carrego via ajax, porém utilizo este mesmo formulário tanto para edição, como para inserção, para facilitar manutenções futuras. Então, no topo da view que contém este formulário (sim, eu faço uso de MVC), eu criei um objeto que espera receber dados quando se tratar de uma edição e fica vazio quando se tratar de uma adição. Desta forma, quando eu atribui aos values dos inputs o seguinte: <?= $myObject->myProperty ?>. Daí a duvida! Quando trata-se de uma edição eu tenho o notice "Trying to get property of non-object", pois o objeto não recebeu dados. E gostaria de saber qual é a melhor forma de acessar os dados deste objeto.. Por favor, levem em consideração que eu gostaria de continuar usando um único formulário para essas rotinas.. Agradeço desde já! Compartilhar este post Link para o post Compartilhar em outros sites
Cristianoferr 32 Denunciar post Postado Outubro 3, 2013 isso acontece quando o objeto não foi inicializado ou não existe. Compartilhar este post Link para o post Compartilhar em outros sites
Progsick 0 Denunciar post Postado Outubro 3, 2013 isso acontece quando o objeto não foi inicializado ou não existe. Certo, mas eu gostaria de obter um exemplo de como lidar com isso. Para não ter o "Notice" eu estou fazendo o seguinte em cada input: <input type="text" name="products_espessura" value="<?= (isset($productData->products_espessura))?($productData->products_espessura):(null); ?>"> Isso evita o Notice, porém deve haver formas melhores.. Obrigado pela resposta Cristianoferr! Compartilhar este post Link para o post Compartilhar em outros sites
Thadeu Esteves 3 Denunciar post Postado Outubro 3, 2013 Operadores de controle de erro http://php.net/manual/pt_BR/language.operators.errorcontrol.php Melhores Praticas PHP http://br.phptherightway.com/ <input type="text" name="products_espessura" value="<?= @$productData->products_espessura; ?>" /> Compartilhar este post Link para o post Compartilhar em outros sites
Cristianoferr 32 Denunciar post Postado Outubro 3, 2013 Cara, você deveria ver porque o objeto não está sendo inicializado. Se tá dando esse aviso é porque está errado. Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Outubro 3, 2013 Operadores de controle de erro http://php.net/manual/pt_BR/language.operators.errorcontrol.php Melhores Praticas PHP http://br.phptherightway.com/ <input type="text" name="products_espessura" value="<?= @$productData->products_espessura; ?>" /> arroba? O.o Compartilhar este post Link para o post Compartilhar em outros sites
Thadeu Esteves 3 Denunciar post Postado Outubro 3, 2013 arroba? O.o shini, segue a pergunta do Dreyfi Certo, mas eu gostaria de obter um exemplo de como lidar com isso. Para não ter o "Notice" eu estou fazendo o seguinte em cada input: <input type="text" name="products_espessura" value="<?= (isset($productData->products_espessura))?($productData->products_espessura):(null); ?>"> Isso evita o Notice, porém deve haver formas melhores.. Obrigado pela resposta Cristianoferr! O Objeto não está criando devido não existe mesmo, como ele quer eliminar o notice, pode-se usar o '@' qual o problema? No caso dele, quando o objeto não existir ele gostaria que aparece em branco o input... Como isso é um forum aberto, se eu estiver errado me corrija por favor para que eu possa aprender mais. ^^ A outra forma de fazer isso também, porém, mas trabalhosa ex: <?php $modo = $_GET['modo']; switch(@$modo){ ?> <?php case 'insert': ?> //formulario de inserir no banco <?php break; ?> <?php case 'update': ?> //formulario de editar <?php break; ?> <?php } ?> Hoje nos temos varios jeitos de resolver isso, por exemplo, eu poderia criar uma funcao anonima que gera um parametro ex: <?php $form_inserir = function(){ //formulario de inserir; } $form_update = function(){ //formulario de update } $form = function($id = null){ if($id === NULL){ echo $form_inserir(); }else{ echo $form_update(); } } echo $form(); Há um 'gama' de possibilidades basta usar os 'miolos do cerebro'... Compartilhar este post Link para o post Compartilhar em outros sites
Progsick 0 Denunciar post Postado Outubro 4, 2013 Cara, você deveria ver porque o objeto não está sendo inicializado. Se tá dando esse aviso é porque está errado. Cara, ele não está sendo inicializado de propósito quando trata-se de uma adição. Eu vou adicionar um item, por isso não tenho dados pre-carregados. Obrigado por participar! Operadores de controle de erro http://php.net/manual/pt_BR/language.operators.errorcontrol.php Melhores Praticas PHP http://br.phptherightway.com/ <input type="text" name="products_espessura" value="<?= @$productData->products_espessura; ?>" /> Thadeu, obrigado pela sua resposta! Usando o operador arroba, resolveu 100% meu problema, ficou mais limpo e atendeu minha necessidade, porém shini me deixou intrigado. Levando em consideração que a pedida é técnicas de boas práticas, posso estar fazendo "dirty code" desta forma? Obrigado a todos pelo help! Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Outubro 4, 2013 arroba não deve ser usada pq oculta os erros/warnings dificulta saber a origem e o motivo do erro. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Outubro 4, 2013 Sem dúvidas, o arroba é a pior prática do PHP. Você está com o erro, mas está o escondendo. O arroba é a maconha do PHP porque deixa você calmo e relaxado, sem ver nenhum problema, mas os problemas estão ali. Você deveria usar o isset mesmo, mas se mostrar a classe desse $productData. O ideal seria ter um getter para tratar isso, usar propriedades públicas diretamente não é uma boa prática, sabemos bem disso. Compartilhar este post Link para o post Compartilhar em outros sites
Progsick 0 Denunciar post Postado Outubro 4, 2013 Sem dúvidas, vcs têm razão. Não devo ocultar os erros mesmo.. Seria mesmo uma boa se eu tivesse uma classe de propriedades com seus getters e setters mas como podem ver pelo nome da variável, o sistema daqui é bem amador. Cheguei a pouco e estou fazendo o melhor que posso. Assim que eu convencer meus superiores de que o banco terá de ser re-modelado, irei implementar as classes de dados e DAOs. Por hora, vou voltar a usar isset mesmo. Obrigado à todos por me ajudarem! Compartilhar este post Link para o post Compartilhar em outros sites
Raul Silva 41 Denunciar post Postado Outubro 4, 2013 E se você quiser verificar se a variavel é um objeto você pode usar o "is_object()". Realmente, não use o "@". Prefira "<?php echo" ao invés de "<?=". Gostei da explicação do "@" ser a "maconha do php" Rs Compartilhar este post Link para o post Compartilhar em outros sites
Erick Plant 8 Denunciar post Postado Outubro 4, 2013 Só está vazia. Quando hospedar num servidor, não aparecerá essa msg. Tem como tirar a msg no php.ini, mas não é recomendável. O que pode ser feito é verificar se a variável existe, se a variável não existir é atribuído zero. ex: <?php if(!isset($y)) $y = 0; ?> Compartilhar este post Link para o post Compartilhar em outros sites
Progsick 0 Denunciar post Postado Outubro 4, 2013 E se você quiser verificar se a variavel é um objeto você pode usar o "is_object()". Realmente, não use o "@". Prefira "<?php echo" ao invés de "<?=". Gostei da explicação do "@" ser a "maconha do php" Rs Boa! Mais uma lição. Por que não usar as tags template do PHP? Valew pelo exemplo Erick Plant. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Outubro 4, 2013 Porque elas podem estar desativadas em muitos hosts. Compartilhar este post Link para o post Compartilhar em outros sites
Progsick 0 Denunciar post Postado Outubro 7, 2013 Porque elas podem estar desativadas em muitos hosts. Faz sentido, obrigado! Compartilhar este post Link para o post Compartilhar em outros sites