2013-01-13 50 views
1

我離開了原來的問題,但想指出我的問題的假設是有缺陷的。閱讀更多有沒有解決方法,PHP無法在寫入上下文中使用函數返回值?


我很驚訝地發現,這並不在PHP工作更新:

$someObjects = array(); 

function getInstance($key) 
{ 
    if (! $someObjects[$key]) 
     $someObjects[$key] = new Object; 

    return $someObjects[$key]; 
} 

getInstance('mykey')->property = 33; 

最後一行創建了一個致命的錯誤:

PHP Fatal error: Can't use function return value in write context 

這是一個我偶爾在Actionscript中使用的模式,當你需要顯式地定義一堆對象(比如在配置文件中)並且你想跳過實例化步驟也不想處理一堆嵌套數組的混亂。

有什麼建議嗎?


更新

這是閱讀的答覆後,這些的時刻之一。我的問題錯誤地認爲getInstance('mykey')->property = 33是致命錯誤的根源。

我的示例代碼是草率的,而且有兩個大問題(哎呀):

  1. 沒有函數體
  2. 正確使用! $array[$key]代替empty($array[$key])

這些聲明global問題也出現在我的項目代碼中,但它們似乎並不是導致致命錯誤的唯一原因,而且我自此更改了項目代碼,現在我無法弄清楚其他因素是什麼(?)。無論如何,我已經理順了。

低於此建議後,我的目標是爲語法:

class MetaInfo 
{ 
    public $title; 
    public $description; 
} 

/** 
* @param $key string 
* @return MetaInfo 
*/ 
function getMeta($key) 
{ 
    global $meta; 

    if (empty($meta[$key])) 
     $meta[$key] = new MetaInfo; 

    return $meta[$key]; 
} 

getMeta('path/to/page')->title = "Double-check your work before posting"; 
+1

您的更新後,您可以從[這個例子]參見(http://3v4l.org/sZubA),這仍然工作在PHP> 5.0 – nickb

回答

3

這在PHP 5.0.0支持,雖然我不知道你是怎麼得到了工作。 $someObjects將不會在getInstance()的範圍內可用。以下是我與測試,它的工作原理:

<?php 
class Object 
{ 
    public $property; 
} 

function getInstance($key) 
{ 
    static $someObjects; 
    if (! $someObjects[$key]) 
     $someObjects[$key] = new Object; 

    return $someObjects[$key]; 
} 

echo getInstance('mykey')->property = 33; // prints 33 as expected 
+0

你應該使用'static $ someObjects'而不是'global'。 – nickb

+0

您可以在[本示例](http://codepad.viper-7.com/UshEOP)中看到它仍然有效,再加上刪除全局依賴項。 – nickb

+0

修正了,謝謝。 「靜態」沒有想到,很高興你提出了它。 :) – vanneto

相關問題