2016-10-03 4 views
0

Я столкнулся с странной проблемой. У меня следующий простой строки в PHPСтранное поведение isset и пустой функции

<?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 
?> 

Почему это вторая линия не печатает true или печатает «1» и третья строка его пустым, когда его видно из первой строки, this->language установлен и не пуст ??

+0

Можете ли вы показать вывод 'print_r ($ this-> language);'? –

+0

@RaxWeber, он печатает 'en' – WatsMyName

+0

Тогда нет ничего плохого в этом. –

ответ

1

вместо «echo» использовать var_dump.Will поможет вам понять разницу.

$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

первая строка возвращает 'string (2)« en »', вторая строка возвращает 'bool (false)', а третья строка возвращает 'bool (true)', поэтому это не помогло мне – WatsMyName

+0

@WatsMyName может быть не помог вам, но его правильное и ожидаемое поведение – Zmrzka

+0

isset() проверить, установлено ли значение или нет? & empty() Определить, считается ли переменная пустой. Переменная считается пустой, если она не существует или ее значение равно FALSE. empty() не генерирует предупреждение, если переменная не существует. Больше подробностей. http://php.net/manual/en/function.empty.php & http://php.net/manual/en/function.isset.php –

1

Ниже фрагмент кода поможет вам

Если переменная объявлена ​​как частное в родительском классе он не будет доступен в дочернем классе, он должен быть либо защищен или частной

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

Пояснение для isset() как показано ниже.

isset($this->language) всегда будет эхом «ложным». потому что isset() принимает переменные как параметры, но в этом случае $this->language НЕ ПЕРЕМЕН. это значение VALUE, возвращаемое методом __get() класса. Таким образом, выражение isset($this->language) всегда будет равным «false». Пожалуйста, обратитесь http://php.net/manual/en/function.isset.php

Объяснение для пустой(), как показано ниже.

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 

Результат для пустой ($ registry-> notEmpty) немного неожиданным, так как значение, очевидно, задано и не пусто. Это связано с тем, что в этих случаях функция empty() использует __isset() магическую функцию. Обратитесь к http://php.net/manual/en/function.empty.php

0

На самом деле, код очень сложный, код, над которым я работал, построен с помощью Silverstripe. Но я нашел грязное обходное решение, которое будет работать и на простом PHP.

в родительском классе, я создал метод, который проверяет, если язык установлен, как этот

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

и в дочернем классе мы можем просто использовать $this->isLanguageEmpty()

Но чтобы понять, что может быть актуальной проблемой , комментарии в оригинальном посте и другие ответы будут полезны.

Смежные вопросы