“__class magic method”(通过自定义代码调解对类名的引用)

时间:2010-11-12 02:35:23

标签: php magic-methods

您可以使用__get,__ call。

将调用重定向到某些属性/函数

有没有办法为课程做?

我想将代码中some_class_name的所有提及转换为MY_VERSION_some_class_name(不仅对于一个类,它是一个模式)。

如果方法/属性是此重命名策略的目标,这将很容易。

你能想到用PHP编写类的方法吗?

编辑:我需要这个来引用不同情况下不同类的变种。我需要将一个类名解析为此类的不同变体,具体取决于运行时已知的条件,并在整个会话期间保持不变。

由于

P.S。 如果您好奇我为什么要这样做,请查看Maintaining variants of an application

3 个答案:

答案 0 :(得分:4)

您无法将代码中some_class_name的所有提及转换为另一个类。但是,您可以将变量用作类名:

$className = "MyClass";
$obj = new $className;
$className::myMethod();

您所要做的就是更改变量,您将使用不同的类。如果你必须为很多课程做这件事,你可能想为它创建一些工厂。

$factory = System::getFactory();
$obj = $factory->getAuthObj();

基本上,System类将根据特定运行时需要使用的类返回不同的对象。

答案 1 :(得分:1)

Aiden未经测试的方法:变量变量并生成字符串:

<?php
$dog = "12";

function getDogClass($myNum)
{
    global $dog;
    // Do something dynamic here;
    $dog = "Dog_" . $myNum;
    return "dog";
}

class Dog_13rc1
{
    function __construct()
    {
        printf("Woof!");
    }
}

class Dog_12
{
    function __construct()
    {
        printf("Grrrr");
    }
}

$myObj = new ${getDogClass('13rc1')}();
?>

只要对getDogClass()的调用返回范围内变量名称的字符串,那么你就是好的。

输出为woof

这意味着您需要的唯一重构是使用该调用查找/替换类名的出现。

但这很严峻。而且可能很慢。此外,维护/错误跟踪梦魇类型的黑客。

答案 2 :(得分:0)

你想要的神奇功能是__autoload

function __autoload($class_name) {
    // include your special class in here
    include $class_name . '.php'; 
}

在此处阅读更多内容:http://php.net/manual/en/language.oop5.autoload.php