2016-10-03 3 views
0

Ich stoße auf seltsames Problem. Ich habe folgende einfache Linie in PHPMerkwürdiges Verhalten von isset und leerer Funktion

<?php 
    echo "Value = ".$this->language; //outputs Value = en 
    echo "<br>isset = ".isset($this->language); //Outputs isset = 
    echo "<br>Is empty = ".empty($this->language); //Outputs Is empty= 1 
?> 

Warum ist, dass die zweite Zeile nicht druckt true oder ‚1‘ und dritte Zeile druckt seine leer, wenn seine klare aus erster Linie, dass this->language gesetzt und nicht leer ist ??

+0

Können Sie die Ausgabe von 'print_r ($ this-> language);'? –

+0

@RaxWeber, es druckt 'en' – WatsMyName

+0

Dann ist nichts falsch daran. –

Antwort

1

anstelle von 'echo' verwenden var_dump.Will Ihnen helfen, den Unterschied zu verstehen.

$language = 'en'; 
echo "Value = ".$language; //outputs Value = en 
$isset = isset($language); 
$empty = empty($language); 
echo "<br>isset = ";; 
var_dump($isset); //bool(true) 
echo "<br>Is empty = "; 
var_dump($empty); // bool(false) 
+0

erste Zeile gibt 'string (2)" en "' zurück, zweite Zeile gibt 'bool (false)' zurück und dritte Zeile gibt 'bool (true)' zurück, also bedeutet das nicht, dass – WatsMyName

+0

@WatsMyName es sein kann hat dir nicht geholfen, aber sein richtiges und erwartetes Verhalten – Zmrzka

+0

isset() überprüfe, ob der Wert gesetzt ist oder nicht? & leer() Ermitteln, ob eine Variable als leer angesehen wird. Eine Variable wird als leer angesehen, wenn sie nicht existiert oder wenn ihr Wert gleich FALSE ist. empty() generiert keine Warnung, wenn die Variable nicht existiert. für mehr Details. http://php.net/manual/en/function.empty.php & http://php.net/manual/en/function.isset.php –

1

Below Code Snippet Sie sollten

helfen Wenn der Variable als privates es in der Kinderklasse sein wird, nicht im übergeordneten Klasse deklariert ist, hat es entweder geschützt werden oder private

class base { 
    // changed to protected 
    protected $language = 'en'; 
} 

class child extends base { 

    public function spit(){ 
    echo "Value = ".$this->language; //outputs Value = en 
    echo "<br>isset = ".isset($this->language); //Outputs isset = 
    echo "<br>Is empty = ".empty($this->language); //Outputs Is empty= 1 
    } 
} 
$ch = new child(); 
$ch->spit(); 
1

Erklärung für isset() ist wie folgt.

isset($this->language) wird immer 'falsch' echo. weil das isset() VARIABLES als Parameter akzeptiert, aber in diesem Fall ist $this->language KEINE VARIABLE. Es ist ein Wert, der von der __get() -Methode der Klasse zurückgegeben wird. Daher wird der Ausdruck isset($this->language) immer gleich 'false' sein. Bitte beziehen Sie sich auf http://php.net/manual/en/function.isset.php

Erklärung für leer() ist wie folgt.

class Registry 
{ 
    //Definition goes here 
} 
$registry = new Registry(); 
$registry->empty = ''; 
$registry->notEmpty = 'not empty'; 

var_dump(empty($registry->empty)); // true, so far so good 
var_dump(empty($registry->notEmpty)); // true, .. say what? 
$tmp = $registry->notEmpty; 
var_dump(empty($tmp)); // false as expected 

Das Ergebnis für empty ($ Registry-> notEmpty) ist etwas unerwartet, da der Wert offensichtlich und nicht leer gesetzt. Dies liegt daran, dass die Funktion empty() in diesen Fällen die magische Funktion __isset() verwendet. Bitte beziehen Sie sich http://php.net/manual/en/function.empty.php

0

Eigentlich ist der Code sehr komplex, der Code, mit dem ich arbeitete, ist mit Silverstripe gebaut. Aber ich habe einen dreckigen Workaround gefunden, der auch auf PHP funktioniert.

in übergeordneter Klasse, habe ich eine Methode, die prüft, ob die Sprache festgelegt ist, wie dies

public function isLanguageEmpty(){ 
     return isset($this->language); 
    } 

und in der Kinderklasse können wir einfach $this->isLanguageEmpty()

verwenden aber zu verstehen, was das eigentliche Problem sein könnte , die Kommentare im ursprünglichen Beitrag und die anderen Antworten werden hilfreich sein.