我有遺留PHP代碼一大塊,我需要與該接口看起來像這樣:在PHP中,如何在程序中包裝程序代碼?
//legacy.php
function foo() {
}
function bar() {
}
我希望能夠在一個類來包裝這些傳統功能,或在某種程度上require_once沒有污染,全球命名空間或更改原始文件。
我有遺留PHP代碼一大塊,我需要與該接口看起來像這樣:在PHP中,如何在程序中包裝程序代碼?
//legacy.php
function foo() {
}
function bar() {
}
我希望能夠在一個類來包裝這些傳統功能,或在某種程度上require_once沒有污染,全球命名空間或更改原始文件。
您可以在一個類中使用namespace或靜態方法:
// original file: foo.php
class Foo
{
public static function foo() { }
public static function bar() { }
}
// new file:
require 'foo.php';
class MyNewClass
{
public function myfunc()
{
Foo::foo();
}
}
$x = new MyNewClass();
$x->myfunc();
雙方將需要略作修改的文件。例如,撥打bar()
將不得不被改變爲Foo::bar()
與上面的例子(與靜態方法類)。
或者,使用一個命名空間:
namespace foo;
use \Exception;
// any other global classes
function foo() { }
function bar() { }
在您的文件:
require 'foo.php';
foo\foo();
foo\bar();
請注意,使用命名空間可能需要較少的工作......如果代碼不使用任何類,那麼可能您需要的只是頂部的'namespace foo;'。 – Matthew 2011-05-19 15:34:55
我想我不明白你的解決方案。我需要從類內部調用原始的foo()或bar()函數。 – james 2011-05-19 15:46:57
@james,以上是對原始文件的修改。考慮到這些函數是在不知道新代碼的情況下編寫的,因此不需要將它們與您自己的類文件合併。在您編寫的任何代碼中,您只需將函數調用爲'Foo :: bar()'。Spudley的回答實際上是容易實現,但它同樣的問題,因爲這罹患:如果'FOO()''調用杆()',那麼你就需要修改原來的文件。我建議使用命名空間......這可能是最簡單的解決方案。 – Matthew 2011-05-19 15:51:55
正如在評論中提到的,我會認真地建議看到這是一個重構excersise的機會。
不過,假設你不能這樣做,不管出於什麼原因,在回答你的問題取決於原始legacy.php文件中的函數無論是內部相互調用。
如果不是,那麼是的,這是相當瑣碎,做這樣的事情:
<?php
class legacyFunctions {
require_once('legacy.php');
}
?>
但是請注意,這隻會將它們設置爲公共職能的類中,而不是靜態的,所以爲了給他們打電話,你就必須先初始化類的實例,可能早就在你的代碼作爲一個全球性的(這將是一個單獨的類的一個典型的例子)。
如果您使用PHP5.3,您可能需要考慮使用PHP namespace而不是類,因此可以解決必須實例化類的問題。該機制雖然會大同小異。
但是,如果你的函數調用遺留在PHP代碼中對方,那麼所有這將有可能沒有至少一些編輯你的遺留代碼來改變函數調用他們的新版本。
我建議,這是一個很好的時機,考慮重構。如果它真的是舊代碼,我想說那裏的代碼很可能包含了一些令人討厭的東西。你需要在某個時候清理它;現在看起來像是一個絕好的機會。 – Spudley 2011-05-19 15:29:32
我給出了答案。這很可能不會說你還不知道的任何事情。如果沒有以某種方式修改文件AFAIK,沒有合理的方法來做到這一點。 – Matthew 2011-05-19 15:33:38
@konforce已經給您的解決方案,如果您希望我們建議對您的一些示例代碼,可以幫助我們更可行的解決方案張貼。 – 2011-05-19 15:38:09