2014-07-08 21 views
0

任何人都可以告诉我是否可以重写使用语句吗?PHP命名空间覆盖使用语句

我的例子是有一个MVC设置,其中有核心代码,可以用扩展核心版本的自定义版本覆盖每个控制器/模型。

我面对的问题是,我的核心控制器有一个使用声明,告诉它使用核心模型,所以如果我扩展模型,我不知道如何告诉它使用自定义模型而不是核心一个

我能明显更新核心控制器使用语句来指向自定义的,但核心代码共享,所以自定义版本可能无法使用这个核心的核心

使用语句显然是其他网站存在文件级别,所以我猜这是不可能的,但我希望有一些我不知道或者可能的解决方法

实施例

核心控制器

namespace Core; 

use Core\Model\Example as ExampleModel; 

class ExampleController { 

    public function output() { 
     $model = new ExampleModel; 
     $model->test(); 
    } 

} 

核心模型

namespace Core; 

class ExampleModel() { 

    public function test() { 
     echo 'This is the core test'; 
    } 

} 

自定义控制器

namespace Custom; 

use Custom\Controller\Example as Base, 
    Custom\Model\Example as ExampleModel; 

class ExampleController extends Base { 

    //Inherits the output() method 

} 

定制型号

namespace Custom; 

use Core\Model\Example as Base; 

class ExampleModel extends Base { 

    public function test() { 
     echo 'This is the custom test'; 
    } 

} 

所以给出这个例子中,有可能是我创造它使用自定义的模型输出的定制控制器的实例,“这是自定义测试”,而无需修改核心代码在所有?

希望就是我要问有道理

感谢

+1

'use'只是在这里一个微不足道的细节。你的控制器扩展了某个阶段,阶段。如果不更改控制器的源代码,则无法更改。 – deceze

+0

另外你的命名空间有**与文件系统**无关。这是一件需要记住的事情。你的方法是重写'output()'方法并在那里实例化对象(如果你绝对需要的话)。 – thpl

回答

1

我不能肯定我明白你的问题,但答案应该是不言而喻的:如果你的自订模式的核心模型扩展,您可以简单地扩展该自定义类中的另一个类
如果您正在编写代码,这取决于核心类的子代,则该子类将成为项目的重要组成部分。如果您无法更改内核本身,请将该类添加为依赖项。就这么简单。

添加第二层继承不需要担心,这样做很常见。像这样的东西是完全可以预见,可靠:

namespace Core; 
class Model 
{ 
    public function coreTest() 
    { 
     return 'from the core'; 
    } 
} 
namespace Custom; 
use Core\Model; 
class CustomModel extends Model 
{ 
    public function customTest() 
    { 
     return 'from the custom model'; 
    } 
} 
//finally 
namespace Project; 
use Custom\CustomModel; 
class ProjectModel extends CustomModel 
{ 
    public function test() 
    { 
     return array(
      $this->coreTest(), 
      $this->customTest(), 
      'From the project' 
     ); 
    } 
} 
$test = new ProjectModel(); 
echo implode(PHP_EOL, $test->test()); 

但如果你想有一个给定的类从另一个类扩展,基于该类是否存在,你正在寻找有条件进口
一个简单的use语句是在编译时评估的,因此您无法使用if检查来切换扩展的类。

然而,有一个hacky解决方法,但我不会依赖它。检查给定的类是否存在(没有自动加载),并为该类设置一个别名。

if (!class_exists('\\Custom\\Model', false)) 
    class_alias('\\Core\\Model', 'Base'); 
else 
    class_alias('\\Custom\\Model', 'Base'); 
class CustomModel extends Base 
{} 

但真的:不要走这条路。确保你的代码可以工作,但是如果你依赖可用的方法,那是在自定义类中定义的,但是那个类缺失,那么你的代码将会失败......非常可怕。

详细有条件进口:

Why use class alisases?

+0

谢谢你的回答。有条件的导入肯定会解决我的问题,但我会尽量避免在可能的情况下使用它们。我认为我最好的选择是知道我知道有条件的使用语句没有一种不可靠的方式,那就是始终拥有自定义的空白版本的核心类,或者覆盖任何使用自定义模型的方法。再次感谢 – steveking198