JRL*_*JRL 2 php logging pear reference object
我正在使用PHP 5.2.14和PearLog 1.12.3.Log.php(PEARLog)中单例方法的最新文档说明:
您必须使用$ var =&Log :: singleton()语法调用此方法.如果方法名称前没有&符号,则不会得到引用; 你会得到一份副本.
但是,这样做会产生以下警告:
严格注意:只能通过引用分配变量
该函数的来源是:
public static function singleton($handler, $name = '', $ident = '',
$conf = array(), $level = PEAR_LOG_DEBUG)
{
static $instances;
if (!isset($instances)) $instances = array();
$signature = serialize(array($handler, $name, $ident, $conf, $level));
if (!isset($instances[$signature])) {
$instances[$signature] = Log::factory($handler, $name, $ident,
$conf, $level);
}
return $instances[$signature];
}
Run Code Online (Sandbox Code Playgroud)
如果我删除&只使用:
$var = Log::singleton()
Run Code Online (Sandbox Code Playgroud)
然后我不再收到警告了.另外,如果我这样做
$var = Log::singleton();
$var2 = Log::singleton();
Run Code Online (Sandbox Code Playgroud)
然后$ var === var2计算结果为true.
问题:哪个是正确的:API文档或警告?(如果函数返回一个对象,不管它是不是参考?为什么我需要&符号?
Jer*_*emy 10
在PHP5中,对象的传递方式从根本上改变了.在PHP4中,它们总是按值传递,这意味着返回对象的函数或方法实际上是将对象的副本传回.这导致使用'&'运算符,强制函数通过引用返回对象.在PHP5中,对象始终通过引用传递.要创建对象的副本,必须使用克隆运算符.
通过快速查看日志包的源代码,可以看出它与PHP4保持兼容.我不认为你需要&符号.PHP5将返回对该对象的引用.您对'$ var === $ var2'的测试证明该方法返回一个对象,该对象是对一个对象的引用.如果它们是对象的副本,则身份比较将评估为false.