PHP命名空间和包含类的Include()

cyd*_*ydo 10 php namespaces

我需要扩展一个项目.所有类都在单独的文件中,我需要扩展一些类而不重写其他文件中的现有代码.我的想法是使用命名空间,但我失败了.这是一个例子:

我已将原始的A.php类文件重命名为A_Original.php:

class A
{

    public function hello()
    {
        echo "hello world from Class A\n";
    }

}
Run Code Online (Sandbox Code Playgroud)

然后创建了一个新的A.php:

namespace AOriginal {

    include 'A_Original.php';
}


namespace {

class A
{

    public function hello()
    {
        echo "hello world from Class A Extended\n";
    }

}

}
Run Code Online (Sandbox Code Playgroud)

这会失败,因为在including原始的A_Original.php文件中,类被转储到全局范围(因此忽略命名空间命令).我无法修改A_Original.php文件中的现有代码,但重命名是可以的.

其他项目文件(我无法修改)使用a require "A.php".

怎么做到这一点?

cyd*_*ydo -4

怎么样eval()

新的A.php

$lines = file('a_original.php');
array_unshift($lines, 'namespace AO;?>');
$string = implode(chr(13).chr(10), $lines);
eval($string);

class A extends AO\A
{   
    public function hello()
    {
        parent::hello();
        echo "hello world from Class A Extended\n";
    }
}
Run Code Online (Sandbox Code Playgroud)