2013-07-28 4 views
0

저는 OOP에 친숙합니다. 컴포지션과 __autoload()이 함께 작동하는 방법을 잘 모릅니다. 내가 현재 만들고자하는 것은 꽤 많은 다른 클래스가있는 클래스입니다. 이 게임은 컨텍스트를 제공하기 위해 동시에 개발되는 인디 롤 플레잉 게임을 지원합니다.PHP 5.3 : __autoload()를 사용하여 다른 클래스의 클래스를 인스턴스화하십시오.

기본 파일 구조 간다 :

로컬 호스트/프로젝트/

  • index.php를
  • lib 디렉토리/

로컬 호스트/프로젝트/lib에

  • 일반 .php
  • 클래스/

로컬 호스트/프로젝트/lib 디렉토리/클래스

  • Character.php
  • SkillSet.php
  • Equipment.php

등등. index.php에서 내가 가진 :

다음
<?php 
require_once("lib/common.php"); 
// ...bunch of bootstrapping and what not... 
$char = new Character; 
?> 

common.php에 :

<?php 
define("DS", "/"); 
define("SER", "localhost"); 
define("BASE", "project"); 
define("LIB", "lib"); 
define("CLS", "class"); 

function __autoload($class_name) { 
    include CLS.DS.$class_name . ".php"; 
} 

마지막으로, 메인 클래스, Character가 열립니다로 :

<?php 

class Character { 
    // properties 
    public $skills  = new SkillSet; 


    public function character() { 
    //init 
    } 
} 
?> 

내가 이것을 실행하면, 나는에서 Parse error: syntax error, unexpected 'new' (T_NEW) in...를 얻을 수 캐릭터,하지만 나는 이유가 확실하지 않습니다. $char을 할당 할 때까지 common.php이로드되었으므로 __autoload()을 사용할 수 있으며 실제로는 Character을 찾습니다.

내 질문 : 이) 왜 __autoload()는 클래스 내에 작동하지 않으며, 는 ㄴ) 구성 을 예정이다 객체 지향 PHP에서 수행 할?

대단히 감사합니다!

답변

4

구문 오류는 자동 로딩과는 아무런 관련이 없습니다. 코드의이 시점에서이 클래스를 만들 수 없습니다 (자바가 아닙니다). 스칼라의 정적 값은 속성의 초기 값으로 만 할당 할 수 있습니다.

다른 클래스로 해당 속성을 초기화하려면 __construct() 함수 내에 할당하십시오.

구성 성분 : 직류 주입을 사용하십시오. 외부 세계가 클래스 내부에서 클래스를 생성하는 대신 사용할 클래스를 전달하도록 허용합니다.

+0

a) 고마워, 나는 그 일을 할 수 없다는 것을 깨닫지 못했다 : 할당과 b) 내가 따르고 있는지 확인하기 위해, 당신은''SkillSet' 클래스를''index .php' 그리고'Character'에 넘겨 주면 되겠습니까? 클래스 내부에서'__autoload()'하는 방법이 없습니까? – Jonline

+0

NVM; 'common.php'의'__autoload()'는 여러분의 충고에 따라 생성자에서 할당을 수행하자마자 잘 작동합니다. – Jonline

관련 문제