1

我正在尝试找到一种解决方法,使静态变量不被复制到扩展类(这与后期静态绑定不能很好地配合),这是我认为可能有效的方法,但给了我一个“PHP致命错误:可以” t 在写上下文中使用函数返回值”:

<?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";
}

显然这是一个编译时错误,因为我的 echo 没有运行。

我在这里做错了什么?

4

1 回答 1

0

以下代码行是错误的:

public static function & __callStatic($method,$args)

您需要匹配__callStatic函数Docs的定义,并且没有通过引用返回:

public static function __callStatic($name, $arguments)

所以你试图达到的目标是不可能的。

而您周围的另一个问题应该能够通过后期静态绑定(LSB) Docs解决。

还要记住,Magic 很难调试,所以准备好你的单步调试器并单步调试应用程序,这样你就可以更好地了解实际发生的情况。PHP 中的调试器称为 Xdebug,大多数 PHP IDE 和编辑器都支持它。

于 2012-07-01T10:38:26.783 回答