Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php $new=新自我($data);使用私有函数甚至变量oO?_Php_Oop_Scope_Stdclass - Fatal编程技术网

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

Php $new=新自我($data);使用私有函数甚至变量oO?,php,oop,scope,stdclass,Php,Oop,Scope,Stdclass,我在PHP5.3中有一个奇怪的行为 我有一个类,它在一个函数中 $new = new self($data); $new->setServiceManager($this->service); $new->cacheInstance(); 但是函数cacheInstance是一个私有函数 private function cacheInstance() { foreach ($this->data a

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

我有一个类,它在一个函数中

       $new = new self($data);
        $new->setServiceManager($this->service);
        $new->cacheInstance();
但是函数cacheInstance是一个私有函数

private function cacheInstance()
    {
        foreach ($this->data as $name => $class) {...}
    }
有人能解释一下为什么会这样用吗?这个方法不应该是私有的,也不应该是外部无法访问的吗

更新:


好吧,现在我完全迷路了。。。我甚至可以访问实例的私有变量。。。比如说。。。这一定是某种预期的行为,有人能告诉我一个方向吗?

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

就你而言:

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

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

引述:

同一类型的对象将具有相互访问的权限,并且是私有的 受保护的成员,即使它们不是相同的实例。这是 因为特定于实现的详细信息在 在那些物体里面


谈论维尔德

private
protected
public
可访问性在类级别工作,而不是在对象级别

虽然首先看起来似乎有悖常理,但这并不是您通常的PHP怪癖

在其他OOP语言中也是一样的,比如 请注意,可访问性是一个静态属性,可以在编译时确定;它只依赖于类型和声明修饰符

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

(新增亮点)

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

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


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

new self()
当然表示您在那个类中。因为你在类/对象中,所以你可以访问它的私有。你能提供更多的代码吗,因为现在我看不出有什么问题。如果你能用new self()创建一个新实例,这意味着你在类上下文中,所以在我看来一切都很好。听起来好像类在调用构造函数,而不是函数。谢谢。有道理。。。以一种奇怪的方式:P
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