Jak nastavit error_reporting() tak, při $this->neexistujici_promenna vypsal chybu – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

 Jak nastavit error_reporting() tak, při  $this->neexistujici_promenna vypsal chybu – PHP – Fórum – Programujte.com Jak nastavit error_reporting() tak, při $this->neexistujici_promenna vypsal chybu – PHP – Fórum – Programujte.com

 

Jarda
~ Anonymní uživatel
199 příspěvků
6. 8. 2008   #1
-
0
-

Ahoj,

nejak se mi nedaří nastavit error_reporting() (nebo ini_set('error_reporting',...)
tak, aby vypsal Warning o pristupu k neexistujici promenne.

Priklad:




error_reporting(E_ALL | E_STRICT | E_NOTICE);
class A
{
public $promenna;

function __construct()
{
$this->neexistujici_promenna = "nic";
}
}
$obj = new A();


Tento priklad mi nevypíše žádnou chybu/varování/notice...

Předem děkuji...

Nahlásit jako SPAM
IP: 82.142.65.–
bukaj0
Věrný člen
6. 8. 2008   #2
-
0
-
Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Jarda
~ Anonymní uživatel
199 příspěvků
6. 8. 2008   #3
-
0
-

To bukaj :
Bohuzel zadna zmena, stale žádná hláška. Dost mě to štve kvůli snadnému zanesení chyby díky překlepu -
chci nastavit proměnnou například width pomocí $this->widht a php mě na překlep neupozorní.

Pokud se pokusim pouzit neinicializovanou promennou,
např.



echo $neinicializovanaPromenna;

vrátí to notice 'Undefined variable', takže jinak error_reporting funguje dobře.

Nahlásit jako SPAM
IP: 82.142.65.–
zaachi0
Newbie
6. 8. 2008   #4
-
0
-



class test{
function __construct(){
$this->varialbe = 'null';
}

function __set( $var ){
print 'Neexistujici promenna: $' . $var;
}
}
new test();

Pomoci chybovych hlaseni toho co chces asi nedosahnes.
Ale __Set ti oznami neexistujivi vlastnost (promenna jak tomu rikas ty).
Popripade __Get je pro neexistujici metody.

Nahlásit jako SPAM
IP: 88.146.210.–
bukaj0
Věrný člen
6. 8. 2008   #5
-
0
-

Jarda
Ano, tak jsem to otestoval a opravdu PHP nikdy nic nezahlásí. Dokonce jde taková nedeklarovaná, ale „vytvořená“ vlasnost využívat pak i v jiných metodách. PHP mě opět zklamalo (už jsem si ale nějak zvykl :o)).

zaachi
Popripade __Get je pro neexistujici metody.
Jen bych poopravil, ne __get(), ale __call()[1].

[1] http://php.net/__call#language.oop5.overloading.methods

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
zaachi0
Newbie
6. 8. 2008   #6
-
0
-

Jej pardon. Uz si to moc nepamatuju jak vidim :)
__get je pro vlastnost, ktera neni zpristupnena pro cteni.

Nahlásit jako SPAM
IP: 88.146.210.–
Jasir0
Duch
7. 8. 2008   #7
-
0
-

To zaachi :
To bukaj :

(zaregistroval jsem se pod nickem Jasir, tedy Jarda ~ Jasir;)

Panové, děkuji, vidím, že budu dělat spoustu překlepů i nadále. :(
V tomto je PHP opravdu s prominutím na prd.

Jak to vidím já, nejlepší je zřejmě vůbec nepřistupovat k veřejným vlastnostem (proměnným :)
pomocí $obj->vlastnost ale pro každou vlastnost vytvořit get/set metody. Je to práce navíc, mírné zpomalení,
na druhou stranu z hlediska návrhu to není vůbec špatné.

Co se týče privátních vlastností, tam to jde v podstatě také, ale už je to docela opruz vyrábět get/set
metody, takže buďto maximálně zvýšená opatrnost, a nebo opravdu pro každý objekt vytvořit __get(), __set() metody s hláškou chyby/překlepu.

Nahlásit jako SPAM
IP: 82.142.65.–
7. 8. 2008   #8
-
0
-

Vytvareni getteru/setteru neni vubec spatna praxe. Treba ja ve svych tridach public promenne vubec nevedu.

Nahlásit jako SPAM
IP: 213.220.192.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
zaachi0
Newbie
7. 8. 2008   #9
-
0
-

No a nebo pouzivat lepsi editor, ktery metody a vlastnosti nabizi a tak se jednoduse vyhnout preklepum.

Nahlásit jako SPAM
IP: 88.146.210.–
hrach
~ Redaktor
+1
Boss
7. 8. 2008   #10
-
0
-
Nahlásit jako SPAM
IP: 193.179.169.–
http://jan.skrasek.com@hrachcz – webdeveloper
7. 8. 2008   #11
-
0
-

Ja jsem zastance druheho hlavne z praktickeho hlediska. Viz:



$object=new object;
$object->varA="valA";
$object->varB="valB";
$object->varC="valC";
$object->doSomething();

vs.
object()->setA("valA")->setB("valB")->setC("valC")->doSomething();

Nahlásit jako SPAM
IP: 213.220.192.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
bukaj0
Věrný člen
7. 8. 2008   #12
-
0
-

hrach
Zajímavé články. Hlavně ten první. Ale ještě zajímavější jsou komentáře pod ním. Největší problém validace až při ukládání bych viděl v tom, co napsal Lars Strojny v prvním bodě svého komentáře[1] – není vidět, kde chyba nastala, takže se může táhnou v instanci bůhví odkud a ve větších systémech to bude opravdu těžké zjistit. Teď si nemohu vzpomenout, jak se tomu principu přesně nadávalo v angličitně, ale bylo to něco ve smyslu, že pokud nastane chyba, je potřeba ji oznámit co nejdříve a co nejhlasitěji – je pak jednodušší takovou chybu odstanit. Když nevím, kde chyba nastala nastala, její najití je mnohem těžší, je-li možné.

A další věc, ke které mě přivedl komentář od jazzslidera, je to, že mnoho lidí (autor článku nejspíš taky) nahlíží na instanci jako na strukturu. Když budem na bakovní účet nahlížet jako na strukturu, která v sobě akorát skrývá výši zůstatku, opravdu asi nemá cenu psát gettery a settery – „je to práce na víc“. Pokud ale na instanci opravdu pohlížíme jako na entitu, která nám poskytuje nějaké možnosti s ní pracovat (viz ten interface, který je v tom komentáři), zpřítupňování vlastností by bylo akorát na obtíž.

Z toho článku cítím jediné – díky příkladům ušitým „na míru“ řešení se dá ostatními jednoduše manipulovat :o)

[1] http://debuggable.com/posts/programming-psychology-ii-private-methods:481ed862-b0d8-4a0e-9247-165c4834cda3#comment-48726288-7480-48c2-9976-4f8d4834cda3
[2] http://debuggable.com/posts/programming-psychology-ii-private-methods:481ed862-b0d8-4a0e-9247-165c4834cda3#comment-48737fa1-ee00-42d6-bfd0-7c634834cda3

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Jasir0
Duch
7. 8. 2008   #13
-
0
-

Zajímavé články, s prvním nesouhlasím, resp. souhlasím s Larsem Strojnym a bukajem :)
Btw, já to řeším nějak takhle, pokud chci třídu která bude mít možnost setovat property tak ji udělám potomkem
této třídy. Nic však není dokonalé ;)

minusy:
- setters/getters fungují i na privátní properties (funkce property_exists() nerozlišuje)
- zpomalení

Co si o takovém řešení myslíte?




class Core_ObjectWithProperties
{
/**
* Toto je __stub funkce pro settery a gettery tridy.
* Problem - public/private, da se nastavit i private
*/
function __call($fcename,$args)
{
$fce=substr($fcename,0,3);
$var=strtolower(substr($fcename,3,1)).substr($fcename,4);
$cnt=count($args);

switch($fce)
{
case 'set':
if($cnt != 1)
throw(new Exception("setter $fcename() needs exactly ONE parameter!"));

if(!property_exists($this,$var))
throw(new Exception("$fcename() - class variable \$$var does not exists!"));

$this->$var = $args[0];

break;
case 'get':
if($cnt != 0)
throw(new Exception("getter $fcename() does not take any parameter!"));
if(!property_exists($this,$var))
throw(new Exception("$fcename() - class variable \$$var does not exists!"));

return $this->$var;

break;
default:
throw(new Exception("unknown method called: $fcename()"));

}
}

}

Nahlásit jako SPAM
IP: 82.142.65.–
hrach
~ Redaktor
+1
Boss
7. 8. 2008   #14
-
0
-

To bukaj : Myslí si, že nejlepším řešením je samozřejmě kombinace obojího. Viz. třeba metoda isValid(). Jeji vytvoreni size onen pristp s getery setery nevylucuje, ale primo ji nevyzaduje :) Tak to aspon vnímám já.

Nahlásit jako SPAM
IP: 193.179.169.–
http://jan.skrasek.com@hrachcz – webdeveloper
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý