Импорт 2 класса с тем же именем

В 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, и я не могу изменять классы, поскольку они используются другими файлами классов.

это не самый красивый и он может быть не самым эффективным, но он работает. Концепция заключается в том, что вместо «включения» файлов вы читаете их как строки, обертываете пространство имен, которое вы даете ему, а затем оцениваете его, а затем позволяете вам вызывать каждую функцию с пространством имен …

Мне нужно добавить некоторые сумасшедшие реквизиты к альгису для его кода. В этом примере я подстроил его, чтобы сделать то, что вы хотели сделать.

  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 

Вы можете использовать пространства имен, но вы не можете просто указать файл как указано в 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(); 

Используйте пространство имен. Синтаксис следующий:

 file1.php <?php namespace "mynamespace"; class apple{ } ?> 

В настоящий момент классное яблоко доступно только в пространстве имен mysoft namespace. Создание экземпляра класса, как это не будет работать:

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

Вам нужно будет использовать пространство имен, чтобы PHP нашел определение класса следующим образом:

 <?php require_once "file1.php" use mynamespace; $apple = new mynamespace\apple(); ?> 

Я думаю, для этого вам нужно использовать пространства имен

Я не эксперт в пространствах имен, но я бы предположил что-то вроде этого.

 <?php namespace red { include (apple1.php); } namespace green { include (apple2.php) } ?> 

затем вызовите тогда, как $ nice = new red / apple () и $ rotten = new green / apple ()