2

__get、__ callを使用して、呼び出しを一部のプロパティ/関数にリダイレクトできます。

クラスのためにそれを行う方法はありますか?

コード内のsome_class_nameのすべての言及をMY_VERSION_some_class_nameに変換したいと思います(1つのクラスだけでなく、パターンです)。

メソッド/プロパティがこの名前変更ポリシーのターゲットである場合、これは簡単です。

PHPのクラスでそれを行う方法を考えられますか?

編集:さまざまな状況でクラスのさまざまなバリアントを参照するためにこれが必要です。実行時に既知の条件に応じて、このクラスのさまざまなバリアントに解決され、セッション全体を通じて永続化される1つのクラス名が必要です。

ありがとう

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 に答える