当前位置: 首页 > 知识库问答 >
问题:

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

仲高超
2023-03-14

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

我有课要讲这个

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

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

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

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

更新:

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

共有3个答案

越扬
2023-03-14

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

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

引用:

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

谈论维尔德。。。

蓟俊杰
2023-03-14

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

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

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

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

(新增亮点)

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

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

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

相俊迈
2023-03-14

如果你可以用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
 类似资料:
  • 问题内容: 我想更新会话变量。 让我在简单的示例中对此进行介绍。我们得到一个div,其中包含由PHP脚本打印出的输入字段,一些值等… 示例PHP代码: 假设用户编辑此输入字段(id = Name)并在其中输入名称“ Mark”,然后按保存文本。 单击时,它应该保存/更新会话变量,而无需重新加载页面和刷新输入字段。 那可能吗?也许用ajax / jquery?最重要的是如何? 问题答案: 是的,只需

  • 问题内容: 因此,我们有一个页面: 并想添加一些点击事件: 奇迹般有效!但是,当您将第二个参数设为外部函数时: 它立即调用该函数。我该如何阻止! 问题答案: 由于第二个参数需要函数 引用 ,因此您需要提供一个。使用有问题的代码,您将立即调用该函数并传递其 结果(这是因为,因为该函数所做的全部是且不返回任何内容)。在匿名函数中调用该函数(如您的第一个示例),或者更改该函数以返回一个函数。

  • 问题内容: 我看到很多执行“松散”私有变量/功能的python代码。他们将用一个下划线(例如_foo)声明函数/变量,然后仅在类/文件中使用它。他们不使用双下划线确实让我感到烦恼,因为最终,有人会从班级外部将此人称为“私人”成员。 是否有某种方法可以在单个下划线上强制执行隐私(不更改为双下划线)?谢谢! 问题答案: 否。这就是python的理念:不要让编译器/解析器强制执行隐私,因为 想要 访问私

  • 我甚至不使用新的遗迹,我得到了他们的错误。事情就这么突然发生了。 我使用的是最新的Android Studio构建(0.61)。就连我的主分支也有同样的错误。我的机器上有其他项目使用新的遗迹,但不是这个。这个项目没有使用新的遗迹在任何方式,与其说是一个任性的梯度依赖。 项目的build.gradle: 编辑 该项目现在在建筑中导入新的遗迹。根据用户的建议。这解决了这个问题,但我仍在探索为什么,因为

  • 我甚至不使用新的遗物,我得到错误的他们。只是突然发生了。 我使用的是最新的Android Studio版本(0.61)。甚至我的主分支也有同样的错误。在我的机器上有其他的项目使用新的遗迹,但没有这一个。这个项目不使用新的遗迹在任何方式,更多的是一个任性的梯度依赖。 我试着清理我的gradle缓存,重新下载所有的第三方库,没有工作。 编辑 该项目现在根据用户建议在Build.Gradle中导入新的遗

  • JavaScript中私有变量的使用 JavaScript中没有私有成员的概念;对象属性是公有的。但JavaSctipt中有个私有变量的概念: 任何在函数内部定义的变量都可以认为是私有变量,它只在这个函数内部有效,不能通过外部函数来访问。私有变量大概有:函数参数、局部变量和函数中嵌套的函数。 function add (num1, sum2) { var sum = num1 + num2