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

Php get_class_vars()未显示变量,但在同一类上运行的属性_exists()返回true,php,class,object,Php,Class,Object,我在学习PHP,并且开始玩类——下面可能是有史以来最基本的对象,lol <?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

我在学习PHP,并且开始玩类——下面可能是有史以来最基本的对象,lol

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

?>

然后运行上面的程序,它应该输出一些数据。在本课中(由“,”编写的视频培训系列),Kevin的屏幕看起来是正确的(他使用的是5.2.6)

我的WAMP安装在5.3上,我的类Person的“first_name”属性没有被循环吐出。。。然而,
echo属性存在(“person”,“first-name”)?'真’:‘假’返回true

有人能帮我了解出了什么问题吗?

get\u class\u vars()只返回公共访问变量,而property\u exists()检查公共、受保护和私有变量

vs。
属性\u exists
如果属性存在,则无论属性的范围和调用方是什么,都将返回true

get\u class\u vars
将返回可从当前作用域访问的所有属性,以及它们的静态值或默认值(对于未声明为静态的属性)。但是,它不会返回未在类主体中声明的属性,也不会接受对象参数

请注意,如果使用类名查询未在类主体(即:对象上下文)中声明的属性,则
属性\u 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"

@netcoder——啊,我明白了——那么我的
var$first\u name
没有被声明为公共的原因是什么?我理解两者之间的区别,但不是我为什么会遇到这种区别…@朱利安:这是公开的。但它返回默认值,即
null
(即:打印时没有任何内容)。@Julian:您可能应该将其声明为
public
,而不是
var
。)@netcoder-我知道它将返回
null
,但让我重新表述一下问题:为什么每个其他变量(包括
last_name
,也是
null
)都会显示在
foreach
循环的输出中?将
public
添加到
first\u name
不会改变任何内容。。。它仍然没有得到吐痰的循环@朱利安:不幸的是,我没有任何Windows机器,所以我不能测试它。但是就像我说的,你真的应该升级到至少5.3.1。它解决了很多问题。