get_class_vars() 未显示变量,但在同一类上运行的 property_exists() 返回 true

jlm*_*kes 3 php class object

我正在学习 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';

?>
Run Code Online (Sandbox Code Playgroud)

然后运行上面的代码,应该会输出一些数据。在课程(Kevin Skoglund的视频培训系列“ PHP:超越基础知识”)中,Kevin 的屏幕看起来正确(他使用的是 5.2.6。)

我的 WAMP 安装版本为 5.3,并且 Person 类的“first_name”属性没有被循环吐出...但返回echo property_exists("person","first_name") ? 'true' : 'false';true。

谁能帮助我理解出了什么问题?

net*_*der 5

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"
Run Code Online (Sandbox Code Playgroud)