2

您可以使用 __get、__call 将调用重定向到某些属性/函数。

有没有办法在课堂上做到这一点?

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

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

你能想出一种方法来为 PHP 中的类做这件事吗?

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

谢谢

ps 如果您好奇我为什么要这样做,请查看维护应用程序的变体

4

3 回答 3

4

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

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

您所要做的就是更改变量,您将使用不同的类。如果您必须为很多类执行此操作,您可能希望为它创建某种工厂。

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

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

于 2010-11-12T02:41:30.040 回答
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

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

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

于 2010-11-12T02:52:35.490 回答
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

于 2010-11-12T02:48:03.690 回答