2011-11-03 48 views
2

我有一個場景,我試圖合併幾個人的PHP工作,其中一些OOP和一些沒有。我想將一個函數庫文件放到一個類中,並且這些函數可以被引用該類的其他文件使用。我知道我可以直接調用庫函數,但是我必須更新所有依賴文件才能做到這一點。例如:任何方式來聲明一個類中的常規函數​​作爲一種方法?

class do_something { 
    function test_state() { 
    ... 
    } 

    if ($this->test_state($var)) { 
    ... 
    } 
} 

凡test_state()是相同的庫文件中的同名函數,使得對於冗餘代碼保持同步時間。這可以更改爲:

class do_something { 
    if (test_state($var)) { 
    ... 
    } 
} 

但是,創建了這個 - $> test_state()不被提供給依賴於類文件的上述問題。我希望能夠做的是一樣的東西:

class do_something { 
    public function test_state() = test_state(); 

    if ($this->test_state($var)) { 
    ... 
    } 
} 

很顯然,這是什麼,我試圖做...一個非常粗糙的和不正確的例子是在有任何OOP方式,使該重新分配的方式,使得該方法與班級內可用的功能同名?

+0

所以你想採取壞/無組織的代碼和半重構它,以便它做你想做的。當下一個「你」出現時會發生什麼,並且必須處理?最好花時間做正確的事。 – thetaiko

+0

那麼,當你這麼說...其實,我只能控制一部分代碼,所以我的選擇是有限的。 – overflowing

回答

0

你會創建你的基本工具類,然後extend它。有關詳細信息,請參閱PHP的手冊條目inheritance。我並不是說這是針對您的確切情況的最佳解決方案,但我認爲它回答了您試圖解決的問題。

2

您可以使用替代方法來模擬此操作。事實上,您通常會希望這種方法能夠將閉包鎖定到PHP中的對象。它利用PHP中的魔術__call方法將方法調用重定向到普通函數(注意:沒有可用的$)。

class do_something { 

    function __call($func, $args) { 
     if (isset($this->$func) && is_callable($this->$func)) { 
      return call_user_func_array($this->$func, $args); 
     } 
    } 
} 

然後你就可以「註冊」要允許(或關閉)用一個簡單的分配功能:

$do_something->function_name = "global_function_name"; 
$do_something->or_even = array("other_class", "method"); 

但同樣,這並不能使他們適當的方法本身。

+0

+1這是一個很好的通用方法,比我描述的每個函數方法的新方法更容易管理。您可能會考慮將函數定義放在專用的$ _libraryMethods數組中,以將它們與真正的類成員變量隔離。 – majelbstoat

+0

這看起來像最乾淨的方法,但如果我不能使用$這個,它並不真正解決修改依賴文件的問題,我沒有完全控制。 – overflowing

+0

要明確,您可以(並且必須)在課堂內使用$ this來訪問這些功能。假設我正確地理解了這個問題,這會做你所需要的。 – majelbstoat

0

什麼你問的是不可能的直接,但可以用一個快速的(恐怖)僞造破解:

class do_something { 
    public function test_state($param) { 
    return test_state($param); 
    } 

... 

    $this->test_state($param); 
... 

} 

祝你好運與重構!

+0

這並不美麗,但它可能會訣竅。我只需要提供一些功能。 「重構」......在尋找答案時知道這很有用! – overflowing

相關問題