本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

PHP call_user_func_array 实例内部实例

发布于2023-11-29 20:02     阅读(416)     评论(0)     点赞(6)     收藏(3)


<?php

class foo 
{
    private $callVar = false;
    private $constructorVar = false;

    public function __construct()
    {
        $this->constructorVar = get_class($this);
    }

    public function __call($methodName, $arguments) 
    {
        $this->callVar = get_class($this);
        call_user_func_array(array($this, $methodName), $arguments);
    }

    protected function method($params)
    {
        echo('<br>Call var: '.$this->callVar.'<br>Constructor var: '.$this->constructorVar);
    }
}

class foo_sec extends foo
{
    protected function method($params)
    {
        echo 'First call: ';
        parent::method($params);
        echo '<br> Second call: ';
        $test = new foo_trd();
        $test->method('param2');
    }
}

class foo_trd extends foo
{

}

$m = new foo_sec();
$m->method('param');

?>

给出这个结果:

First call:
Call var: foo_sec
Constructor var: foo_sec
Second call:
Call var:
Constructor var: foo_trd

此代码应返回当前正在运行的实例的名称,但如果该实例位于另一个实例内,则第二个实例中的类名称为空。这是 PHP 错误还是我遗漏的其他问题?

换句话说,Call var第二次调用中的 应该是foo_trd- 不为空。


解决方案


我相信您正在经历一些与 PHP 及其继承可见性相关的有趣事情。

简而言之,当您在 和 的实例内部时,Foo您可以访问也扩展的所有其他实例的protected和范围由于您可以直接访问 ,因此您将跳过对 的调用privateFooprotected method()__call()

当您想要将构造函数设为私有并强制执行工厂时,这实际上很有用。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.phpheidong.com/blog/article/550172/e21f941989842f46a217/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

6 0
收藏该文
已收藏

评论内容:(最多支持255个字符)