您可以使用__get,__ call。
将调用重定向到某些属性/函数有没有办法为课程做?
我想将代码中some_class_name的所有提及转换为MY_VERSION_some_class_name(不仅对于一个类,它是一个模式)。
如果方法/属性是此重命名策略的目标,这将很容易。
你能想到用PHP编写类的方法吗?
编辑:我需要这个来引用不同情况下不同类的变种。我需要将一个类名解析为此类的不同变体,具体取决于运行时已知的条件,并在整个会话期间保持不变。
由于
P.S。 如果您好奇我为什么要这样做,请查看Maintaining variants of an application
答案 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