在PHP中,如何在类中包含过程代码?

时间:2011-05-19 15:20:26

标签: php namespaces legacy-code

我有一大堆遗留的PHP代码,我需要与之接口,如下所示:

//legacy.php

function foo() {
}

function bar() {
}

我希望能够将这些遗留函数包装在类或某种方式require_once中,而不会污染该全局命名空间或更改原始文件。

2 个答案:

答案 0 :(得分:2)

您可以在班级中使用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()

OR,使用命名空间:

namespace foo;

use \Exception;
// any other global classes

function foo() { }
function bar() { }

在您的档案中:

require 'foo.php';

foo\foo();
foo\bar();

答案 1 :(得分:1)

正如评论中所提到的,我认真地建议将此视为重构范围的机会。

但假设您无论出于何种原因无法做到这一点,您问题的答案取决于原始legacy.php文件中的函数是否在内部相互调用。

如果没有,那么是的,做这样的事情是相当微不足道的:

<?php
class legacyFunctions {
require_once('legacy.php');
}
?>

但请注意,这只会将它们设置为类中的公共函数,而不是静态函数,因此为了调用它们,您必须首先实例化该类的实例,可能在代码的早期实例化为全局(它将是单例类的经典示例)。

如果您使用的是PHP5.3,您可能需要考虑使用PHP namespace而不是类,这样可以解决必须实例化类的问题。但机制大致相同。

但是,如果您的函数在遗留的PHP代码中相互调用,那么如果没有对遗留代码进行至少一些编辑以将函数调用更改为新版本,则无法实现这一功能。