2012-06-15 2 views
1

클래스 메서드에서 함수를 만들 수 있습니까?클래스 메서드에 함수 할당

즉.

class Test { 

    public function __construct() 
    { 
     if (! function_exists('foo')) { 
      function foo() 
      { 
       return $this->foo(); 
      } 
     } 
    } 

    private function foo() 
    { 
     return 'bar'; 
    } 

} 

아니면 다른 방법으로 함수를 만들고 메서드 내에서 사용해야합니까?

+1

'function_exists'는 클래스 메소드가 아닌 전역 함수를 검사합니다. 전역 함수는'$ this'에 접근 할 수 없습니다. 그곳에서 성취하려는 것은 무엇입니까? http://docs.php.net/manual/en/reflectionmethod.getclosure.php – Gordon

+0

을 통해 클래스 메서드 밖에서 클로저를 만들 수 있습니다. 클래스 메서드의 복사본 인 전역 함수를 만들려고합니다. 자바 스크립트 토지에서 함수가 변수 일 뿐이며 쉽게 복사 할 수 있습니다. –

답변

0

그냥 그런 식으로 그것을 할, PHP는 내가 수업 방법의 카피 인 전역 함수를 만들려고 해요

class Test { 

    public function __construct() 
    { 
     if (! function_exists('foo')) { 
      function foo() 
      { 
       return $this->foo(); 
      } 
     } 
    } 

    private function foo() 
    { 
     outsidefunction(); 
     return 'bar'; 
    } 

} 

private function outsidefunction() 
{ 
    return 0; 
} 
0

그것을 할 수 있습니다. 나는 함수가 단지 변수 인 자바 스크립트 토지에서 왔고, 당신은 쉽게 그것들을 복사 할 수있다. ...

PHP의 함수는 PHP에서 같은 변수 주위에 함수를 복사 할 수 없다. a reference to a function을 사용할 수는 있지만 기능 자체는 사용할 수 없습니다. Closure$GLOBALS에서, 예를 들어, 전화 기능 foo을 이론적으로

0

, 당신은 $GLOBALS 통해 참조 use Reflection to get a Closure 수있는 다음 정의

Run Demo

<?php // requires 5.4 
class Test { 

    public function __construct() 
    { 
     if (!function_exists('foo')) { 
      $reflector = new ReflectionMethod(__CLASS__, 'foo'); 
      $GLOBALS['foo'] = $reflector->getClosure($this); 
      function foo() { 
       return call_user_func($GLOBALS['foo']); 
      } 
     } 
    } 

    private function foo() 
    { 
     return 'bar'; 
    } 
} 

$test = new Test(); 
echo foo(); 

은 그러나, 매우 못생긴 당신은 이런 식으로하고 싶지 않아.

당신이 객체와 같은 더 자바 스크립트를 원하는 경우

하지만 여전히, 거기에도 제안 된 기술은 잡든지이 IMO 있습니다 살펴 있습니다.