$ new = new self($ data);有私人功能甚至变量oO?

时间:2015-10-01 08:20:47

标签: php oop scope stdclass

我的php 5.3中有一个奇怪的行为

我在一个函数

中有一个类
       $new = new self($data);
        $new->setServiceManager($this->service);
        $new->cacheInstance();

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

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

有人可以解释为什么这样可以这样使用吗?这个方法不应该是私人的,也不能从外面进入吗?

更新:

好吧现在我完全迷失了......我甚至可以访问实例的私有变量......就像......这必须是某些预期的行为,可以让我指向一个方向吗?

3 个答案:

答案 0 :(得分:3)

如果您可以使用new self()创建一个类实例,则意味着您在该类中,当然您可以访问私有属性和函数。此代码段取自PHP文档(link

/**
 * 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

答案 1 :(得分:1)

privateprotectedpublic辅助功能适用于类级别,而不适用于对象级别。

虽然它首先看起来似乎是反直觉的,但这不是你平常的PHP怪异。

在其他OOP语言中也是如此,例如Java

  

请注意,辅助功能可以在编译时确定的静态属性;它仅取决于类型和声明修饰符。

C#

  

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

(已添加精选)

说明

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

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

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

答案 2 :(得分:0)

好吧......像量子力学一样奇怪...已经在RL中指出了答案

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

QUOTE:

  

相同类型的对象可以私密访问彼此   受保护的成员,即使它们不是相同的实例。这是   因为实现具体细节已经知道了   在那些物体里面。

谈论奇怪......