【问题标题】:How to get a class' "public" instance from its definition如何从定义中获取类的“公共”实例
【发布时间】:2016-09-05 11:10:10
【问题描述】:

在类方法的定义中,我包含了一个外部文件。我希望这个外部文件无法访问$this,而只能访问“公共”实例,即只有公共方法和属性。

到目前为止,我已经尝试使用匿名函数 call_user_func 和返回 $this 的方法。

我已经看到我可以在我的匿名函数中取消设置 $this 而不会改变其余的执行,但我还没有找到一种方法来获取我想要的实例。我想我可以尝试取消设置匿名函数中的所有非公共属性和方法,但我想知道是否没有更简单的方法。

Class Foo{
    private $test = 23;

    public function getFoo(){
      return $this;
    }

    public function inclFile($file){
      $foo = call_user_func([$this, 'getFoo']);
      $r = function()use($foo){
        unset($this);
        var_dump($foo->test); // i am getting it!
        require($file);
      };
      $r();
      // Here $this is still set
    }
}

【问题讨论】:

    标签: php oop


    【解决方案1】:

    我会稍微改变一下设计,然后创建这个函数(并将其放置在任何地方):

    function access_object_in_file($file_to_require, $object) {
        require $file_to_require;
    }
    

    这会将文件的范围限制为只能访问$object。由于 PHP 是 PHP,您的文件将被允许创建反射类、解析回溯等,但变量范围仅限于 $object

    如果您不希望将任何类型的对象传递给函数,我会为其添加一个接口和类型提示,例如:

    // let's pretend we're in a view layer
    function render($view_file, Properties $object) {
        require $file_to_require;
    }
    

    【讨论】:

    • 谢谢,我刚试过,但是如果我从类内部调用这个第一个函数,问题是一样的,即使函数是在类外部定义的:我可以访问私有属性跨度>
    • @nabab 这就是require(以及该系列语言结构)在 php 中的工作方式,它基本上是剪切和粘贴一个文件的内容来代替 require 语句。这就是为什么我建议您将逻辑移到一个空函数 (access_object_in_file()) 中,以便它具有一个空范围,除了函数的参数 ($object) 和文件的内容。
    • 是的,我想我明白了,但是这个函数必须从类定义外部调用,因为如果我使用$this 作为参数从内部调用它,我仍然可以从函数内部访问私有属性.现在,如果我必须从类外部调用该方法,使用该对象作为参数,我知道它会起作用,但它不符合我的类的逻辑,更改将是一个巨大的混乱:(
    • 您是否尝试将代码中的function()use($foo) 替换为function($foo)?这可能与我所暗示的相同,但我不太确定 php 的匿名函数的范围。编辑:也将$foo 替换为$foo = $this。嗯..不确定范围会发生变化,但值得一试。
    • 对不起,您的第一个答案是正确的。我用的是静态方法而不是函数,作用域不一样。如果静态方法来自另一个类或者它只是一个函数,则作用域变为公共的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-03-21
    • 2012-03-03
    • 1970-01-01
    • 2015-07-13
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多