2009-12-27 5 views
53

T_PAAMAYIM_NEKUDOTAYIM이 실제로 이국적인 소리를 지지만, 확실히 확실히 나에게는 넌센스입니다. 이 코드 줄까지 모두 추적했습니다.이것은 무엇을 의미합니까? "구문 분석 오류 : 예기치 않은 T_PAAMAYIM_NEKUDOTAYIM 구문 오류"

<?php 
Class Context { 
    protected $config; 

    public function getConfig($key) { // Here's the problem somewhere... 
    $cnf = $this->config; 
    return $cnf::getConfig($key); 
    } 

    function __construct() { 
    $this->config = new Config(); 
    } 
} 
?> 

생성자에서 구성 개체를 만듭니다. 여기에 클래스의 :

final class Config { 
    private static $instance = NULL; 
    private static $config; 

    public static function getConfig($key) { 
    return self::$config[$key]; 
    } 

    public static function getInstance() { 
    if (!self::$instance) { 
     self::$instance = new Config(); 
    } 
    return self::$instance; 
    } 

    private function __construct() { 
    // include configuration file 
    include __ROOT_INCLUDE_PATH . '/sys/config/config.php'; // defines a $config array 
    $this->config = $config; 
    } 
} 

오류가 무엇을 의미하는지이 나던 일/...

+0

가능한 중복 [PHP는 T 기대 \ _PAAMAYIM \ _NEKUDOTAYIM?] (http://stackoverflow.com/questions/592322/php-expects-t-paamayim-nekudotayim) –

답변

61

T_PAAMAYIM_NEKUDOTAYIM은 이중 콜론 범위 해상도는 PHP가 사용 말았입니다 - :

, 나는이 줄을 코드에서

빠른 눈을 생각 :

return $cnf::getConfig($key); 

이어야를

return $cnf->getConfig($key); 

첫 번째 방법은 메소드를 호출하는 방법입니다. 정적으로 -이 코드는 $ cnf에 유효한 클래스 인 문자열이 포함 된 경우 유효합니다. -> 구문은 클래스/객체의 인스턴스에서 메소드를 호출하기위한 것입니다.

+0

이것은 PHP를 결코 고려하지 않는 거의 완벽한 이유처럼 들립니다. 괜찮은 오류 메시지를 생성하는 것이 그리 어렵지 않았을 것입니다. – paxdiablo

+11

히브리어 - Zend Engine은 처음에 이스라엘 출신 인 Andi Gutmans와 Zeev Suraski에 의해 개발 되었기 때문에 (http://en.wikipedia.org/wiki/Zend_Engine 참조) –

+16

위키 백과에서 "PHP에서는 범위 분해능 운영자는 Paamayim Nekudotayim (히브리어 : פעמיים נקודתיים, 히브리어로 "두 번 콜론"또는 "이중 콜론"을 의미하는 "[paʔamajim nəkudotajim] 발음)"으로 불린다. -> 모든 개발자의 99.9 %가 히브리어를 아주 잘 말하면, 나는 저주해야합니다 : 나는 Objective-C를 사랑합니다. 그리고 지금 나는 이유를 안다. – openfrog

2

오류는 이중 콜론 연산자의 "부적절한 사용"아래입니다 : 당신은 클래스 자체의 정적 메소드를 호출하려고 시도하고

return $cnf::getConfig($key); 

::를 사용하여한다. 예제에서는 인스턴스화 된 객체에서 비 정적 메서드를 호출하려고합니다.

내가 당신이 원하는 것은 생각 :

return $cnf->getConfig($key); 
+0

@ benlumley의 답은 위의 표현보다 훨씬 더 좋습니다. – richsage

2

의 이름입니다

아마
return $cnf::getConfig($key) 

은 다음과 같아야합니다

return $cnf->getConfig($key) 

그리고 getConfig이 문제가 향후 방문객하지 정적

10

그냥 내 두 센트를합니다. 이전에 $ CNF 변수에 클래스 이름을 지정하면

MyClassName::getConfig($key); 

, 당신은 정적 메서드를 호출 할 수

이것은 PHP 5.3에 대한 올바른 구문, 예를 들어, 당신은 클래스 이름에서 정적 메서드를 호출하는 경우 그것으로부터 (우리는 PHP 5에 대해 이야기하고 있습니다.3) :

$cnf = MyClassName; 
$cnf::getConfig($key); 

그러나,이 sintax는 PHP 5.2 이하에서 작동하지 않습니다, 당신은 다음을 사용합니다 :이 명 (5.2 버전에서이 오류를 가진 데 도움이

$cnf = MyClassName; 
call_user_func(array($cnf, "getConfig", $key, ...otherposibleadditionalparameters...)); 

희망을 이것이 오픈 개구기 버전인지는 모르겠다.)

1

여전히 다음 두 콜론을 사용하여 확인이 필요한 경우 PHP 5.3+에

+3

[tomasofen 's answer] (http://stackoverflow.com/a/17333414/499214)는 이미이를 말하고 있습니다. 어쩌면 당신은 자신의 정보를 조각화하는 대신에 그것을 업보 포지 드하고 싶습니까? –

관련 문제