提问者:小点点

$new=新自我($data);使用私有函数甚至变量oO?


我在PHP5.3中有一个奇怪的行为

我有课要讲这个

       $new = new self($data);
        $new->setServiceManager($this->service);
        $new->cacheInstance();

但是函数cacheInstance是一个私有函数。。。。

private function cacheInstance()
    {
        foreach ($this->data as $name => $class) {...}
    }

有人能解释一下为什么会这样用吗?这个方法不应该是私有的,也不应该是外部无法访问的吗?

更新:

好吧,现在我完全迷路了。。。我甚至可以访问实例的私有变量。。。比如说。。。这一定是有意为之,有人能给我指个方向吗?


共3个答案

匿名用户

如果你可以用new Self()创建一个类实例,这意味着你在这个类中,当然你可以访问私有属性和函数。这个片段取自PHP文档(链接)

/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private

就你而言:

class Cache {
    private $service = null;

    private function cacheInstance()
    {
        foreach ($this->data as $name => $class) {}
    }

    public function setServiceManager( $service ) {

    }

    public function myTest( $data ) {
        $new = new self( $data );// you are in the class, so you can call new self()
        $new->setServiceManager($this->service);
        $new->cacheInstance();
    }
}
$cache = new Cache();
$cache->service; //Fatal error: Cannot access private property

$data = array();
$cache->myTest( $data );// working

$cache->cacheInstance();// not working

匿名用户

privateprotectedpublic可访问性在类级别工作,而不是在对象级别工作。

虽然这似乎与直觉相反,但这并不是您通常的PHP怪异之处。

请注意,可访问性是一个静态属性,可以在编译时确定;它只取决于类型和声明修饰符。

私有关键字是成员访问修饰符。私有访问是最不允许的访问级别。私有成员只能在类的主体或声明它们的结构中访问

(新增亮点)

可访问性是一种机制,用于对其他类中的代码隐藏实现细节,而不是封装对象。或者正如Java规范中所述,可访问性可以在编译时确定,也就是说,不能因为它是不同的对象而存在运行时冲突。

如果你看看私有和受保护之间的区别,这是有道理的。对于私有成员,如果对象在父类中声明了自己的成员,则对象无权访问这些成员。听起来怪怪的?那是因为术语不对。该类不能访问其父类的私有部分(即它可能不使用它们)。

现在在方法中,在同一个类中使用私有变量。无论运行时的对象是什么,都不需要对这个类的作者自己隐藏这个实现细节。

匿名用户

好啊就像量子力学一样。。。已在RL中指出答案

http://php.net/manual/en/language.oop5.visibility.php

引用:

相同类型的对象可以访问彼此的私有成员和受保护成员,即使它们不是相同的实例。这是因为实现特定的细节在这些对象内部时已经知道了。

谈论维尔德。。。

相关问题