2010-05-02 2 views
10

내 이해에서, 호출 PHP 파일에 붙여 넣기 코드가 필요합니다.PHP는 내부 메서드에서 클래스 호출을 요구합니다

내부에서 메소드를 요구하는 경우 ... 메소드 내에 전체 코드/클래스를 붙여 넣어 메소드의 다음 명령문을 차단합니다.

예 :

function test() { 

    require 'pathtosomeclasscode'; 
    somestatement; // any code after the require is blocked. 

} 

정확한 지점에 코드를 붙여 넣지 않고 코드를 요구할 수 있도록하려면 어떻게해야합니까?

+0

다음 문장이 왜 차단됩니까? – zneak

+0

그것은 모든 코드를 모양에서 제외시킬 것입니다. 클래스가 함수 안에 붙여 넣어지고 있습니다. –

+1

@jera : 그것은 어떻게되지 않습니다. 내 대답에 이것을 말했지만, 여기에 그것을 강화할 것입니다 : 오류/오작동으로 인해 이것이 사실이라고 믿게됩니까? 그렇다면 문제의 원인을 바로 잡을 수 있도록 자세한 정보를 제공해주십시오. – icio

답변

17

다소 놀랍게도 이것은 잘 작동하는 것 같습니다. 포함 된 코드는 Baz :: bork()의 ​​범위 내에서 실행됩니다. 그러나 코드는 단순히 클래스를 정의하며 클래스는 전역입니다. 그래서 당신은 정의 된 클래스로 끝납니다.

파일 : Foo.php :

<?PHP 
class Foo{ 
     function bar(){ 
       echo "Hello from Foo::bar()!\n"; 
     } 
} 

파일 : Baz.php :

<?PHP 
class Baz{ 

     function bork(){ 
       require_once "Foo.php"; 
       $f = new Foo(); 
      $f->bar(); 
     } 
} 

echo "testing internal definition:\n"; 
$b = new Baz(); 
$b->bork(); 

echo "\ntesting in global scope:\n"; 

$f = new Foo(); 
$f->bar(); 
echo "\nall done\n"; 

출력 : 이제

$ php Baz.php 
testing internal definition: 
Hello from Foo::bar()! 

testing in global scope: 
Hello from Foo::bar()! 

all done 

, 나는 많은 곳 어디 생각할 수 없다 당신은 이런 식으로 일을하고 싶습니다. 사람들은 일반적으로 클래스 정의의 외부에서 클래스 파일의 맨 위에 가능한 모든 의존성을 require_once()합니다.

+0

이것은 필요한 파일이 변수 인 경우 유용 할 수 있습니다 :'require_once $ dirName. "/../{$ fileName} .php"; ' –

+0

파일이 네임 스페이스를 지정하면 올바르게 처리 할 수 ​​있습니까? 예, 작동했습니다. – SiXoS

+0

@JamesPoulson 이것은 조건부/지연된 코드로드에도 유용합니다. 예 : 워드 프레스 플러그인은 프론트 엔드/백엔드/아약스 호출/특정 페이지 등에서 만 사용되는 코드를 가지고있을 수 있습니다. 플러그인이 어떤 페이지/포스트인지 알기 전에로드되기 때문에, 액션이 완료되면로드를 지연시켜야합니다. 예, 함수를 호출합니다 ... 이것은 서버 측의 작업 속도를 높일 수 있지만 불필요한 스타일과 스크립트를로드하지 않아도 불필요한 요청을 줄이지 않습니다. – nus

1

try require_once? 당신이 다른 곳에서 그것을 포함 시키면됩니다.

0

include_once ('script.php')를 사용하면 다시 선언되는 클래스에 대한 오류가 발생하지 않습니다.

나는 시도하지 않은

저와 다음,하지만 난 중복)은 (include_once 문하지 않으려면이 설정도 작동 할 수 있습니다 생각하고 있어요 :

class Whatever { 

    protected $classObject; 
    public function __construct(/*...*/) { 
     include('anotherClass.php'); 
     $this->classObject = new anotherClass(); 
    } 

    public function someFunction(/*...*/) { 
     $this->classObject->classObjectFunction(); 
    } 

    public function anotherFunction(/*...*/) { 
     $this->classObject->classObjectFunction(); 
    } 
} 

당신은 다음 코드를 호출 할 수있는

$Whatever = new Whatever(); 
$Whatever->someFunction(); 
$Whatever->anotherFunction(); 
5

require, require_once, include 또는 include_once하지 않습니다 정지를 호출 : 각 동일한 공유 클래스 객체의 함수를 호출 할 것 포함 된 스크립트에 문제가없는 한 함수 내의 코드 실행. 포함 된 파일 내의 코드는 동일한 범위의 함수 (정의 된 함수 및 클래스가 전역)와 함께 실행되고 삽입되지 않고 그 밖의 요소가 대체됩니다.

다른 해결책은 대안으로 require 대안 중 하나를 사용하는 것이 좋습니다. 스크립트에서 오류가 이름 충돌 (예 : 클래스 또는 함수 재정의 시도)과 관련이있는 경우 이러한 해결책이 도움이 될 수 있습니다. 그렇지 않은 경우 문제가 있다고 생각하게하기 위해 발생 원인 (또는 발생하지 않음)에 대한 세부 정보를 제공하여 실제 원인을 해결하는 데 도움을 줄 수 있습니다.

참고로이 파일 포함 방법은 스크립트에 코드를 붙여 넣지 마십시오. 붙여 넣기은 사람들이 텍스트를 유지 관리하는 데 사용하는 도구입니다.

포스트를 다시 경우 '나는 당신이 시도하고 이러한 기능이 작동하는 방법의 이해를 증진하기 위해 PHP 설명서를 읽어 제안 그 (것)들로보기 후에 그들의 일에 추가 질문이있다.

0

당신이 말하는 것은 코드가 즉시 실행되기를 원하지 않는다는 것입니다. 그게 정확하면 몇 가지 옵션이 있습니다 :

  1. 당신은 필요를 이동할 수 있습니다.

  2. 또한 fopen()을 사용하여 파일을 읽고 구문 분석 할 수도 있습니다. , 내가 볼 때,이 클래스를로드하기 위해 외부 파일을 사용하고

0

를 (가 HTML을 이해하지 않기 때문에 당신은 평가 호출 할 수 없습니다,하지만 당신은 파서와 함께 할 수있는) 내가 수정입니까? 왜 Autoloading Classes을 사용하지 않으시겠습니까? 나는 다른 상황에서 다른 클래스 바디를로드하고 싶을 때 작동하지 않을 것이지만 실제로는 좋은 연습인지 여부를 알지 못합니다.