有没有办法在PHP中捕获未定义的全局变量,并提供一个值,如自动加载,但对于变量?

时间:2013-02-06 12:20:28

标签: php autoload globals

我们有很多现有的代码,而不是创建一个类的实例,或者在该类上使用静态函数,将在该类的全局单例上调用该方法。

例如(stringclass.php):

class String {
   function endsWith($str, $search) { 
      return substr($str, -strlen($search)) == $search;
   }
}
$STRING_OBJECT = new String();

然后它将以下列方式使用它:

include_once("stringclass.php");
if ($STRING_OBJECT->endsWith("Something", "thing")) {
   echo "It's there\n";
}

我意识到这不是调用函数的一种非常明智的方法,但我想知道我们是否可以修复人们忘记使用自动加载器包含正确类的所有地方,而不更改所有代码使用这些单身人士。它将检测未声明的全局的使用,并根据被引用的全局名称包含正确的类文件。

1 个答案:

答案 0 :(得分:0)

您可以使用ArrayAccess接口

http://php.net/manual/en/class.arrayaccess.php

class Ztring implements arrayaccess
{
    private $container = array ();

    public function offsetSet ($offset, $value)
    {
        $this->container[$offset] = $value;
    }

    public function offsetGet ($offset)
    {
        // exception
        if ($offset == 'something')
        {
            return 'works!';
        }

        return $this->container[$offset];
    }

    public function offsetExists ($offset)
    {
        return isset($this->container[$offset]);
    }

    public function offsetUnset ($offset)
    {
        unset ($this->container[$offset]);
    }
}


$x = new Ztring ();

$x['zzz'] = 'whatever';
echo $x['zzz']."\n";

echo $x['something']."\n";