导入2具有相同名称的类

Rap*_*tor 5 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
}
Run Code Online (Sandbox Code Playgroud)

鉴于他们的构造函数是相同的,例如:

$appletree = new Apple();
$appleseed = new Apple();
Run Code Online (Sandbox Code Playgroud)

PHP如何区分这两个类?在Java中,我们可以在构造函数之前附加类路径.

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

小智 3

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

我需要为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();
Run Code Online (Sandbox Code Playgroud)

输出:

red
green
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常恶心的解决方案,但它是唯一能够回答OP答案+1的解决方案。 (4认同)