2010-11-12 36 views
2

可以使用__get,__call將調用重定向到某些屬性/函數。「__class magic method」(通過自定義代碼調用對類名的引用)

有沒有辦法做到這一點的類?

我想將代碼中some_class_name的所有提及轉換爲MY_VERSION_some_class_name(不僅對於一個類,它是模式)。

如果方法/屬性是此重命名策略的目標,這很容易。

你能想到一種方法來實現它在PHP中的類嗎?

編輯:我需要這個參考不同情況下類的不同變體。我需要一個類名來解析這個類的不同變體,這取決於運行時已知的條件,並且貫穿整個會話。

謝謝

p.s. 如果您好奇我爲什麼要這樣做,請看Maintaining variants of an application

回答

4

您不能將代碼中的some_class_name的所有提及轉換爲另一個類。但是,您可以使用變量類名稱:

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

所有你所要做的就是改變變量,您將使用不同的類。如果你必須爲很多類做這個,你可能需要爲它創建某種工廠。

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

基本上,System類將基於需要用於特定運行時的類需要返回不同的對象。

+1

+1用於推薦工廠,而不是其他一些嚴酷的方法。無論如何,工廠經常變得有用。 – 2010-11-12 02:48:45

+0

這是一個好主意,但會迫使我重構一個大代碼。還會看起來很醜 - 考慮每一個類似於$ factory-> classVariant('classname')的類名稱,而不是簡單的類名 – shealtiel 2010-11-12 02:48:54

+0

@gidireich通常你會做'$ factory-> getMyModule()'。當你創建'$ factory'時會發生什麼,你創建了一個擁有你想要的類的組合的工廠類。 – 2010-11-12 02:50:31

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

+0

這不會幫助他重定向正在使用的類。 – 2010-11-12 02:49:12

+0

不直接回答我的問題,但*是*有用。這是很有用的,我試圖利用的工具之一 - 加載不同版本的類。 – shealtiel 2010-11-14 02:10:44

1

艾登的未經測試方法:可變變量和生成的字符串:

<?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

這意味着您需要的唯一重構就是通過該調用來查找/替換類名稱的出現。

但這是嚴峻的。並可能很慢。此外,維護/錯誤跟蹤噩夢類型的黑客。

相關問題