get_class_vars () не показывает переменную, но property_exists (), запущенный в том же классе, возвращает true - PullRequest
3 голосов
/ 16 февраля 2011

Я изучаю PHP, и я начал играть с классами - ниже, возможно, самый базовый объект из всех, смеется.

<?php

    class Person {

        var $first_name;
        var $last_name;

        var $arm_count = 2;
        var $leg_count = 2;

        function say_hello() {
            echo "Hello from inside the class " . get_class($this) .".<br />";
        }
        function full_name() {
            return $this->first_name . " " . $this->last_name;
        }
    }

    $person = new Person();

    echo $person->arm_count . "<br />";

    $person->first_name = 'Lucy';
    $person->last_name = 'Ricardo';

    echo $person->full_name() . "<br />";

    $vars = get_class_vars('Person');
    foreach($vars as $var => $value) {
        echo "{$var}: {$value}<br />";
    }

    echo property_exists("person","first_name") ? 'true' : 'false';

?>

Затем запускается вышеприведенное, предполагается выводить немного данных. В уроке (серия видеообучений Кевина Скоглунда , " PHP: помимо основ ") экран Кевина выглядит правильно (он использует 5.2.6.)

У меня установлена ​​версия 5.3 для WAMP, и мой атрибут "first_name" класса Person не выплевывается из цикла ... но echo property_exists("person","first_name") ? 'true' : 'false'; возвращает true.

Может кто-нибудь помочь мне понять, что происходит не так?

Ответы [ 2 ]

4 голосов
/ 16 февраля 2011

property_exists вернет true, если свойство существует, независимо от области действия свойства и вызывающей стороны.

get_class_vars вернет все свойства, доступные из текущей области, вместе с их статическими значениями или значениями по умолчанию (для свойств, которые не объявлены статическими) . Однако он не будет возвращать свойства, которые не были объявлены в теле класса, и не будет принимать аргумент объекта.

Обратите внимание, что property_exists также вернет false, если свойство, которое не объявлено в теле класса (т.е. контекст объекта), запрашивается с использованием имени класса.

За пример:

class Foo {
    public $foo;
    private $bar;

    public function test() {
        var_dump(get_class_vars(__CLASS__));
    }
}

$obj = new Foo;
$obj->baz = 'hello';
property_exists($obj, 'bar');            // true
property_exists($obj, 'baz');            // true
property_exists(get_class($obj), 'baz'); // false

get_class_vars(get_class($obj));         // you get "foo" only
$obj->test();                            // you get "foo" and "bar", not "baz"
1 голос
/ 16 февраля 2011

get_class_vars () возвращает только переменные открытого доступа, а property_exists () проверяет общедоступные, защищенные и приватные.

http://php.net/manual/de/function.get-class-vars.php против http://php.net/manual/de/function.property-exists.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...