导入2具有相同名称的类

时间:2013-05-09 04:13:25

标签: php

在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 个答案:

答案 0 :(得分:4)

它不是最漂亮的,它可能不是最有效的,但它可以工作。这个概念是这样的,而不是“包含”文件,你把它们作为字符串读取,包装你给它的命名空间然后评估它,然后这将允许你用命名空间调用每个函数...

我需要在algisThis example中的代码添加一些疯狂的道具,我调整它来做你想做的事。

    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

答案 1 :(得分: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();

答案 2 :(得分: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();
?>

答案 3 :(得分:-1)

我认为你需要使用namespaces

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

<?php
namespace red {

include (apple1.php);
}

namespace green {

include (apple2.php)
}
?>
然后再打电话给 $ nice = new red / apple()和$ rotten = new green / apple()