5

PHP で、同じ名前の 2 つのサードパーティ クラスをインポートしたいと考えています。例えば:

// in file libs/3rdparty/AppleTree/Apple.php
class Apple extends SomeOtherModel {
  // class details
}

// in file libs/3rdparty/AppleSeed/Apple.php
class Apple extends SomeModel {
  // class details
}

それらのコンストラクターが同じであることを考えると、例えば:

$appletree = new Apple();
$appleseed = new Apple();

PHP はどのように 2 つのクラスを区別できますか? Java では、コンストラクターの前にクラスパスを追加できます。

注: PHP 5 を使用していますが、他のクラス ファイルで使用されているため、クラスを変更できません。

4

4 に答える 4

4

それは最もきれいではなく、最も効率的ではないかもしれませんが、機能します. 概念はこれです。ファイルを「含める」のではなく、それらを文字列として読み取り、指定した名前空間をラップして評価し、名前空間で各関数を呼び出すことができます...

この例では、彼のコードのためにalgisにいくつかの狂った小道具を追加する必要があります。

    function create_namespace($str, $namespace) {
    $php_start = 0;

    $tag = '<?php';
    $endtag = '?>';

    $start_pos = $php_start + strlen($tag);
    $end_pos = strpos($str, $endtag, $start_pos); 

    $php_code = substr($str, $start_pos, $end_pos - $start_pos);
    if (strtolower(substr($php_code, 0, 3)) == 'php')
        $php_code = substr($php_code, 3);

    $part1 = "namespace $namespace ;";

    ob_start();
    eval($part1 . $php_code);
    ob_end_clean();
}

$str1 = file_get_contents('apple1.php');

$str2 = file_get_contents('apple2.php');

create_namespace($str1, "red");
create_namespace($str2, "green");

$apple1=new red\apple();
$apple2=new green\apple();


echo $apple1->color();
echo "<br/>";
echo $apple2->color();

出力:

red
green
于 2013-05-09T13:05:41.700 に答える
1

名前空間を使用できますが、指定された bkdude としてファイルを単純に含めることはできません (アイデアは正しいですが) クラス化されたファイルを宣言するファイルの先頭に名前空間宣言を追加する必要があります。

#file1
namespace red{

    class Apple
    {
        function me()
        {
            echo __CLASS__;
        }
    }

}

#file2
namespace green {

    class Apple
    {
        function me()
        {
            echo __CLASS__;
        }
    }

}

これらのファイルを使用している場所に含めると、次のように使用できるようになります。

$apple1 = new red\Apple();
$apple2 = new green\Apple();

$apple1->me();
$apple2->me();
于 2013-05-09T05:23:54.107 に答える
0

名前空間を使用します。構文は次のとおりです。

file1.php
<?php
namespace "mynamespace";



class apple{

}
?>

現時点では、apple クラスは名前空間 mynamespace 内でのみ使用できます。このようなクラスのインスタンス化は機能しません:

<?php
  require_once "file1.php"
  $apple = new apple();

?>

PHP が次のようなクラス定義を見つけるには、名前空間を使用する必要があります。

<?php
  require_once "file1.php"
  use mynamespace;
  $apple = new mynamespace\apple();
?>
于 2013-05-09T15:07:41.240 に答える