我正在尝试找到一种解决方法,用于不将静态变量复制到扩展类(这与后期静态绑定不能很好地配合使用),这是我认为可能有效的方法,但给了我一个"PHP 致命错误:无法在写入上下文中使用函数返回值":
<?php
class Person
{
protected static $tlsb_names = ['name'];
protected static $tlsb_vars = [];
public static function & __callStatic($method,$args)
{
echo "call static " . $method . " on " . get_called_class() . "'n";
if(in_array($method,static::$tlsb_names))
{
if(!array_key_exists(get_called_class(),static::$tlsb_vars))
{
static::$tlsb_vars[get_called_class()] = [];
}
if(!array_key_exists($method, static::$tlsb_vars[get_called_class()]))
{
echo "set var $method for " . get_called_class() . "'n";
static::$tlsb_vars[get_called_class()] = null;
}
return static::$tlsb_vars[get_called_class()][$method];
}
}
public static function show_name()
{
static::name() . "'n";
}
public static function call_me_al()
{
static::name() = "Al";
}
public static function call_me_joe()
{
static::name() = "Joe";
}
}
class Al extends Person{}
class Joe extends Person{}
Al::call_me_al();
Joe::call_me_joe();
Al::show_name();
Joe::show_name();
有问题的部分是以下几行:
public static function call_me_al()
{
static::name() = "Al";
}
显然这是一个编译时错误,因为我没有运行回声。
我在这里做错了什么?
以下代码行是错误的:
public static function & __callStatic($method,$args)
您需要匹配该__callStatic
函数Docs 的定义,并且没有引用返回:
public static function __callStatic($name, $arguments)
因此,您尝试实现的目标是不可能的。
你绕圈子的另一个问题应该能够通过后期静态绑定(LSB)Docs来解决。
还要记住,Magic很难调试,所以准备好你的步骤调试器并逐步完成应用程序,以便你更好地理解实际发生的情况。PHP 中的调试器称为 Xdebug,大多数 PHP IDE 和编辑器都支持它。