“私人”不是真的私密吗?

时间:2013-11-26 11:46:17

标签: php

class Test
{
    private $private = "";

    public function add($string) {
        $this->private[] = $string;
    }

    public function evaluate(Test $container) {
        return $container->private;
    }
}

$test = new Test();
$test->add("zero");
$test->add("one");
$test->add("two");

$result = new Test();
print_r($result->evaluate($test));

上面的代码演示了私有字符串的转储,这怎么可能? 那么,为什么它被称为“私人”?

任何人都可以向我解释这个吗?

输出:

Array (
    [0] => one
    [1] => two 
    [2] => four
) 

5 个答案:

答案 0 :(得分:2)

因为您正在从类中调用该私有属性。 private表示它只能由其自己的类中的属性和方法使用。您调用一个允许使用该属性的方法。私有属性可以通过它的类访问,即使它是类的不同实例。

您会找到以下内容:

print_r($result::$private);

会给你错误:

  

致命错误:无法访问私有财产

答案 1 :(得分:1)

PHP中的

private表示对任何相同类型的对象都是私有的。

作为stated here in the PHP manual

  

相同类型的对象可以访问彼此私有和受保护的成员,即使它们不是相同的实例。

是的,它与其他一些语言不同,但它有记录,这就是它的工作方式。

答案 2 :(得分:0)

这是因为即使attribute $private是私有的,Test类仍然知道它并且可以访问它,即使它是一个不同的实例。如果您要创建具有相同evaluate method的第二个类Test2(),它需要Test实例,那么evaluate将失败。这有点棘手,但是Test类甚至从远程实例也知道它的所有成员。

答案 3 :(得分:0)

public function evaluate是公共的,它可以访问类中的私有变量。您无法直接访问公共变量,例如$result->$private

答案 4 :(得分:0)

是私有的,因为您无法在课堂外访问此变量/成员。