2013-08-09 4 views
3

나는 내부 클래스를 사용하는 클래스 뒤에 선언 된 클래스에 메소드가있는 다른 클래스의 메소드 내부에서 클래스의 메소드를 호출 할 수 있습니다.선언하기 전에 PHP 클래스를 사용하십시오.

Database.php :

class Database{ 
    modifyUser($field,$change){ 
     global $logging; 
     if($database->query('MYSQL QUERY')){ 
      $logging->modifyUser($field,$change); 
     } 
    } 
} 
$database = new Database; 

Logging.php : 내가 당신에게 예를 보여 드리죠

class Logging{ 
    modifyUser($field,$change){ 
     global $database; 
     $database->query('Mysql Query for Logging'); 
    } 
} 
$logging = new Logging; 

이제 문제는 만약이 같은 포함 된 파일에 사용 상위 클래스 :

user.php

include('database.php'); 
include('logging.php'); 

php는 클래스로 아직 선언되지 않은 $ logging variable을 사용하는 오류를 보여줍니다. 내가 같이 변경하는 경우 :

user.php

include('logging.php'); 
include('database.php'); 

같은 오류 만 $ 데이터베이스에 대한; 나는 PHP가 시퀀스와 충돌하지 않는다는 것을 어떻게 사용하는지 모른다.

,이 중 하나, 당신이 대신 전역 변수를 사용하는 autoloading

을 사용할 수 있습니다, 또한

를로드 할 것이다 당신이 include_once 문/require_once를, 파일이 필요하므로 처음에만 사용할 수있는 모든의
+0

전역 변수가 필요없는 다른 솔루션을 생각해보십시오. 클래스를 하나의 파일에 넣고'$ logging = new Logging()'과'$ database = new Database()'를 include 아래에 위치시킬 수도있다. –

+0

Database 클래스의 $ database라는 이름의 개체를 만듭니다. $ database라는 또 다른 전역 변수를 정의했습니다. $ logging에 대해서도 같은 일이 일어나고 있습니다. 그들에게 별도의 이름을주십시오. 동일한 클래스에있는 다른 함수 내의 메소드에 액세스하려면 범위 분석 연산자를 사용할 수 있습니다. 예를 들면. $ this :: query(); – Debashis

+0

'if (! instanceof ...)' –

답변

2

다음 코드를 명령 줄과 함께 실행하면 "Segmentation fault"오류가 발생할 가능성이 있습니다.

class A 
{ 
    private $b; 
    public function __construct() 
    { 
     $b = new B(); 
    } 
} 

class B 
{ 
    private $a; 
    public function __construct() 
    { 
     $a = new A(); 
    } 
} 

$x = new A(); 


는 무한 루프 같다.

1

우선 인스턴스를 전달하거나 일종의 팩토리를 제공하십시오. 전역 변수에 의존하는 것은 캡슐화에 좋지 않으며 OO 코드에서는 추악합니다.

+0

데이터베이스에서 로깅 클래스를 사용하는 방법은 무엇입니까? 나는 이렇게하기 싫어 : $ database-> modify ($ field, $ change); $ logging-> modify ($ change, $ field)'. 누구든지 수정을 호출 한 다음 데이터베이스에 로그를 추가하고 싶습니다. (추악한 OO 코드에 관해서) –

관련 문제