2013-05-09 4 views
4

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

중복 가능성을 [에 같은 이름의 클래스를 사용하는 방법 PHP는 네임 스페이스를 사용하지 않고?] (http://stackoverflow.com/questions/4023360/how-to-use-same-named-class-in-php-without-namespacing) – DCoder

+0

위의 모든 대답과 같이 중복되지 않습니다. 질문은 수업 수정과 관련이 있습니다. – Raptor

+0

당신이 요구하는 것이 끝날 수 없다는 데모로 보아라. – DCoder

답변

4

가장 좋지는 않지만 가장 효율적일 수는 있지만 작동하지 않을 수 있습니다. 개념은 파일을 "포함"하는 대신 문자열로 읽은 다음 네임 스페이스를 감싸서 평가 한 다음 평가하여 네임 스페이스로 각 함수를 호출 할 수있게합니다.

나는 This example에 그의 코드를 위해 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(); 

출력 :

red 
green 
+4

이것은 꽤 역겨운 솔루션이지만, OPs 응답 인 +1에 응답 할 수있는 유일한 솔루션입니다. –

+0

나는 그다지 예쁘지 않다고 생각하지만, 그의 모든 수업을 포함 시켜서 그것들을 별개의 네임 스페이스로 취급 할 수 있음을 의미한다. 나는 이것이 얼마나 효율적인지에 관해 궁금하다. – bkdude

+0

나는이 미친 접근법을 좋아한다. (그것은 훨씬 더 많은 코딩이 필요하지만) 작동한다. 창의력과 광기를 가져 주셔서 감사합니다 :) – Raptor

-1

당신은 내가 네임 스페이스에 전문가는 아니지만 그러나 나는 이런 식으로 뭔가를 추측 할 namespaces

사용해야합니다.

<?php 
namespace red { 

include (apple1.php); 
} 

namespace green { 

include (apple2.php) 
} 
?> 

후 다음과 같은 $ 멋진 = 새 빨간/사과()와 당신은 이름 공간을 사용할 수 있습니다

+0

어떻게? 설명 할 수 있니? – Raptor

+0

비록 PHP가 모든 include를 별도의 엔티티로 취급하므로 파일을 포함하여 아이디어가 옳다고 생각하지만 문제는 해결되지 않습니다. – xelber

+0

'치명적인 오류 : 이름 공간 선언문은 스크립트의 첫 번째 문장이어야합니다. ' 이 방법은 작동하지 않습니다. (왜 2 upvote 내가 의심스러워?!) – Raptor

0

$ 썩은 = 새로운 녹색/사과()를 호출하지만, 당신은 단순히 bkdude로 파일을 포함 할 수 없습니다 (아이디어를 잘하지만) 지정된 당신은 당신이 그들을 사용하는 곳 그래서 뭔가

#file1 
namespace red{ 

    class Apple 
    { 
     function me() 
     { 
      echo __CLASS__; 
     } 
    } 

} 

#file2 
namespace green { 

    class Apple 
    { 
     function me() 
     { 
      echo __CLASS__; 
     } 
    } 

} 

을 다음과 같이 분류 을 delare 그리고 그 파일을 포함하는 파일의 상단에 네임 스페이스 declarion을 추가해야합니다, 당신 그러면 다음과 같이 사용할 수 있습니다.

$apple1 = new red\Apple(); 
$apple2 = new green\Apple(); 

$apple1->me(); 
$apple2->me(); 
+0

하지만 필요에 따라 제 3 자 파일을 수정할 수 없습니다. – Raptor

+0

그렇다면 아마도 옵션을 포함해서는 안됩니다. 어떤 지점에서 래퍼를 작성하더라도 결국 PHP는 같은 이름에 대해 불평 할 클래스를 포함해야합니다. 함수를 사용하기 위해 간단한 XML-RPC를 사용해야 할 것입니다. – xelber

+0

이 경우를 다루기 위해'XML-RPC '를 사용하는 방법은 무엇입니까? – Raptor

0

를 사용하여 네임 스페이스. 이 순간

file1.php 
<?php 
namespace "mynamespace"; 



class apple{ 

} 
?> 

는, 클래스 사과 네임 스페이스하는 myNameSpace 내에서만 사용할 수 있습니다 : 구문은 다음과입니다. 이 같은 클래스가 작동하지 않습니다 인스턴스화 :

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

?> 

는이 같은 클래스 정의 찾을 수 PHP하기 위해 네임 스페이스를 사용해야합니다의

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

하지만 요구 사항으로 제 3 자 파일을 수정할 수 없습니다. – Raptor

관련 문제