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如何区分这两个类?在 Java 中,我们可以在构造函数之前附加类路径。

注意:我使用的是 PHP 5,我无法修改这些类,因为它们被其他类文件使用。

4

4 回答 4

4

它不是最漂亮的,也可能不是最有效的,但它确实有效。这个概念是这样的,而不是“包含”文件,而是将它们作为字符串读入,将你给它的命名空间包装起来,然后对其进行评估,这将允许你使用命名空间调用每个函数......

我需要在这个例子中为他的代码添加一些疯狂的道具,我调整了它来做你想做的事。

    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 回答
-1

我认为为此你需要使用命名空间

我不是命名空间方面的专家,但我猜是这样的。

<?php
namespace red {

include (apple1.php);
}

namespace green {

include (apple2.php)
}
?>

然后调用 then 像 $nice= new red/apple() 和 $rotten= new green/apple()

于 2013-05-09T04:25:00.190 回答