Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/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类中_Php_Class_Closures - Fatal编程技术网

调用对象内的方法,该对象为';它在php类中

调用对象内的方法,该对象为';它在php类中,php,class,closures,Php,Class,Closures,我需要调用一个在对象内部,在类内部的函数。当然,对于“动态”类方法,我可以使用_-call&_-set-magics调用它,但在这种情况下不行。下面是这种情况的示例 class mainclass { public $v1 = "Hello"; public $fn = null; function __construct( ) { $this->fn = (object) [ "fn1" => null,

我需要调用一个在对象内部,在类内部的函数。当然,对于“动态”类方法,我可以使用_-call&_-set-magics调用它,但在这种情况下不行。下面是这种情况的示例

class mainclass
{
public    $v1    = "Hello";
public    $fn    = null;


function    __construct( )
    {
    $this->fn    = (object) [ "fn1"   => null,
                              "fn2"   => null,
                              ];
    }

public  function __call( $name, array $args )
    {
    return  call_user_func_array( $this->$name, $args );
    }

public    function  fn3()
    {
    echo    "This of course works! <br />";
    }
}


$main = new mainclass();

$main->fn4  = function()
    {
    echo    "Even this works! <br />";  
    };

$main->fn->fn1  = function()
    {
    echo    $this->v1 . " World :)";
    };


$main->fn3(); // This of course works!
$main->fn4(); // Even this works!
$main->fn->fn1(); //Call to undefined method stdClass::fn1() 
class类main类
{
public$v1=“你好”;
public$fn=null;
函数构造()
{
$this->fn=(对象)[“fn1”=>null,
“fn2”=>null,
];
}
公共函数调用($name,数组$args)
{
返回call\u user\u func\u数组($this->$name,$args);
}
公共职能fn3()
{
echo“这当然有效!
”; } } $main=新的mainclass(); $main->fn4=函数() { echo“即使这样也行!
”; }; $main->fn->fn1=函数() { echo$this->v1.“世界:)”; }; $main->fn3();//这当然有效! $main->fn4();//即使这样也行! $main->fn->fn1()//调用未定义的方法stdClass::fn1()
可以这样调用函数“f1:$main->fn->fn1()? 如果没有,有没有不作重大改变的建议

不幸的是,这不是JavaScript,我不喜欢这个类的处理方式,但我必须试一试

$main->fn->fn1();

fn1
是一个属性,请尝试使用
$main->fn
($main->fn->fn1)()应该正在工作。但是,您不能在匿名函数中访问
$this

对于这种情况,唯一简单的解决方法是更改匿名类中的对象。在此过程中,您必须使用类似的变量名“$\u this”将main类的作用域存储在内部匿名类上

class类main类
{
public$v1=“你好”;
public$fn=null;
函数构造()
{
$this->fn=新类($this)
{
public$\u this=null;
公共功能构造($mainscope)
{
$this->_this=&$mainscope;
}
公共函数调用($method,array$args)
{
if(isset($this->{$method}))
{
返回调用用户函数数组($this->$method,$args);
}
elseif(isset($this->_this->{$name}))
{
返回call\u user\u func\u数组($this->\u this->{$name},$args);
}
}
公共函数集($name,$value)
{
$this->{$name}=is_callable($value)?$value->bindTo($this,$this):$value;
}
};
}
公共函数调用($method,array$args)
{
返回调用用户函数数组($this->{$method},$args);
}
公共函数集($name,$value)
{
$this->{$name}=is_callable($value)?$value->bindTo($this,$this):$value;
}
公共职能fn3()
{
echo“这当然有效!
”; } } $main=新的mainclass(); $main->fn4=函数() { echo“即使这样也行!
”; }; $main->fn->fn1=函数() { echo$this->_this->v1.“世界:)”; }; $main->fn3();//这当然有效! $main->fn4();//即使这样也行! $main->fn->fn1()//你好,世界:)

结果不是很难看,也很容易管理。无论如何,这是目前唯一的选择。

如果在需要调用函数之前,函数/闭包存储在
$a->fn->fn1
中,它应该可以正常工作。否则,请尝试自己添加它,如果它是
null
。目前,我唯一的解决方案是使用命名前缀“fn_”,并直接在主类上“附加”函数:$main->fn_f1=function(){……};欢迎提出建议!是的,我理解这一点,但我需要保留范围$this:(如果不可能,我必须更改所有内容。我喜欢这个想法!我必须更改许多变量,但可以管理。谢谢!
class mainclass
{
public    $v1    = "Hello";
public    $fn    = null;


function    __construct( )
    {
    $this->fn    = new class( $this)
        {
        public $_this = null;
        public function __construct( $mainscope )
            {
            $this->_this =  &$mainscope;
            }

        public function __call( $method, array $args )
            {
            if  ( isset( $this->{ $method } )  )
                {
                return  call_user_func_array( $this->$method, $args );
                }
            elseif ( isset( $this->_this->{ $name } ) )
                {
                return call_user_func_array( $this->_this->{ $name }, $args);
                }
            }

        public function __set( $name, $value )
            {
            $this->{ $name } = is_callable( $value ) ? $value->bindTo( $this, $this ) : $value;
            }
        };
    }

public  function __call( $method, array $args )
    {
    return  call_user_func_array( $this->{ $method }, $args );
    }

public  function __set( $name, $value )
    {
    $this->{ $name }    = is_callable( $value ) ? $value->bindTo( $this, $this ) : $value;
    }

public    function  fn3()
    {
    echo    "This of course works! <br />";
    }
}


$main = new mainclass();

$main->fn4  = function()
    {
    echo    "Even this works! <br />";  
    };

$main->fn->fn1  = function()
    {
    echo    $this->_this->v1 . " World :)";
    };


$main->fn3(); // This of course works!
$main->fn4(); // Even this works!
$main->fn->fn1(); //Hello World :)