2012-07-30 2 views
0

클래스를 포함하는 데 문제가 있습니다. 다음은 문제를 설명하기위한 간단한 예입니다.include를 사용할 때 PHP 클래스 경로 충돌이 발생했습니다.

클래스 번호. 1 (경로 : /home/day/Class_A.php) :

class Class_A { 
    public function sayHi() { 
    echo "Good day"; 
    } 
} 

클래스 번호. 2 (경로 : /home/test/Class_B.php)

class Class_B { 
    public function greeting() { 
    if(class_exists("Class_A")!=true) 
     include "../day/Class_A.php"; 
    $test = new Class_A(); 
    $test->sayHi(); 
    } 
} 

PHP 파일 : php.php가 Class_B 등을 포함하는 경우 (경로 /home/php.php)는

if(class_exists("Class_B")!=true) 
    include "test/Class_B.php"; 
    $g = new Class_B; 
    $g->greeting(); 

문제는 Class_B는 Class_A를 포함하고 Class_B는 클래스 객체의 경로가 php.php 파일과 동일하기 때문에 Class_B를 열지 못합니다.

내 질문 : 이 문제를 해결할 수있는 좋은 방법이 있습니까? 변경

+0

스토어 클래스. require_once를 사용하고 클래스의 include 경로에 추가 된 경로를 기준으로 (require_once 구조에서) 경로를 만듭니다. – ghbarratt

답변

5

시도 :

include "../day/Class_A.php"; 

include dirname(__FILE__) . '/../day/Class_A.php'; 

이 방법

에, 당신이 (가) (Class_B)를 포함하고있는 파일에 상대적 것 등이 있습니다.

Class_B::greeting();

당신은 클래스 B 개체를 얻을 수있는 것과 인사말 전화 또는 staticgreetings에 선언을 추가 : 당신이 할 수 없도록 greeting 정적 함수가 아닙니다처럼

+0

고마워,하지만 실제로는 그 반대가 필요하다. 그것은 항상 클래스와 관련이있다. – user1163278

+0

Class_B는 항상'/ dir/test /'에 있고 Class_A는 항상'/ dir/day /'에있을 것입니까? – drew010

+0

네,하지만 그들은 다양한 폴더에서 호출되어 문제를 만듭니다. – user1163278

0

보인다.

둘째, require_once를 사용하지 않으시겠습니까? php.php

require_once('test/ClassB.php');

그리고 ClassB.php에서에서 :

require_once('../day/ClassA.php');

는 아무튼 때 알려 PHP 수있는 마법 기능을 사용하면 정의하는 것이있다
+0

require_once는 기억을 잃어 버리기 때문에 좋은 생각이 아니다. 이유를 기억하지 마십시오. Class_B를 수정하겠다. – user1163278

+0

메모리를 잃지는 않지만 파일이 이미로드되었는지 확인해야하기 때문에 논리가 추가되지만 이점과 단순성은 이러한 작은 성능 문제를 초과한다고 생각한다. 이것을보십시오 : http://stackoverflow.com/questions/186338/why-is-require-once-so-bad-to-use –

0

사용 __autoload, 클래스가로드되어 있지만 해당 클래스를로드해야합니다.

If you define the __autoload function like so, 
function __autoload ($classname) 
{ 
    require('/path/to/my/classes/'.$classname.'.php'); 
} 
you no longer need to add 
require_once('/path/to/my/classes/MyClass.php'); 
into your files, because the first time that PHP encounters 
$mine = new MyClass(); 
or 
MyClass::staticMethodCall(); 
it will automatically call the __autoload function that you defined earlier. 
__autoload('MyClass'); 

리소스 : 당신이 포함 경로에 추가 할 수있는 디렉토리 아래 http://blog.samshull.com/2010/02/why-you-should-use-autoload-function-in.html

관련 문제