在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&我无法修改其他类文件使用的类。
答案 0 :(得分:4)
它不是最漂亮的,它可能不是最有效的,但它可以工作。这个概念是这样的,而不是“包含”文件,你把它们作为字符串读取,包装你给它的命名空间然后评估它,然后这将允许你用命名空间调用每个函数...
我需要在algis为This 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()