2012-05-01 2 views
8

가능한 중복 : 다음 코드
PHP: Static and non Static functions and ObjectsPHP에서 왜 정적 인 방법으로 비 정적 메서드에 액세스 할 수 있습니까?

는 비 정적()은 정적 인 방법이 아니다. 심지어 정적 인 방식으로 객체를 만들지 않고도 액세스 할 수 있습니다. 자바와 같은 다른 언어에서는 이해할 수 없기 때문에 누구나 이해할 수 있도록 도와 주시겠습니까?

<?php 
class MyClass 
{ 
    function nonStatic() { 
     echo "This can be printed"; 
    } 
} 
MyClass::nonStatic(); // This can be printed 
+4

OO 개념이 PHP에 추가 고려 사항으로 포함 되었기 때문에? 진지하게, PHP는 OOP 연구 모델이 아닙니다. – DGM

+0

인스턴스 참조 ('$ this')를 포함하지 않는 한 정적으로 호출 할 수 있습니다. 'E_STRICT'에서 경고를받을 지 확신하지 못합니다. –

+0

이 질문에 더 나은 설명이 포함되어 있기 때문에 중복 된 것에 동의하지 않습니다. –

답변

0

확실하지, 아마 PHP 매직 (가 조금 가끔처럼),하지만 당신은 그것을 할 것이다.

자세한 내용은 여기를 http://php.net/manual/en/language.oop5.static.php

그들은 또한 비슷한 예를 보여 주지만,주의 읽기 :

호출 비 정적 메서드는 정적이 마법 능력은 향후 버전에 사라질 수있는 E_STRICT 수준의 경고의 의미를 생성합니다. 그러니하지 마세요 :)

+1

일반적으로 PHP는 가능한 경우 충돌이 일어나지 않도록하고 불필요한 경우에는 구울 수 있습니다. 그의 예에서는 비 정적 인 것이 수행되지 않기 때문에 그 방법은 실제로 정적입니다. 그것에 대해 생각하는 또 다른 방법은 PHP가 정적으로 사용되도록 의도 되었기 때문에 PHP가 $ this에 대한 호출을하지 않았는지 확인하는 방법입니다. 다른 모든 언어는 어쨌든 그렇게합니다. 그것은 단지 구조입니다.PHP는 스크립트 언어이기 때문에 즉시 컴파일되고 실행되므로 유연성이 뛰어나고 일반적으로 치명적인 오류를 경고로 전환 할 수 있습니다. –

2

PHP 개발자가 정적이 아닌 메소드의 정적 액세스를 허용하지 않는 것으로 보지 못한 것 같습니다. 이것은 실제로 목적을 달성하지 못하는 PHP의 특이한 기능 중 하나 일뿐입니다. 비 정적 메소드를 정적으로 호출하는 것은 잘못된 프로그래밍 습관이지만 PHP에서는 가능합니다. 어쩌면 PHP의 향후 버전에서이 기능을 허용하지 않을 것입니다. 그러나 지금은 단지 언어의 일부일뿐입니다.

편집 :

다행히, 반대는 허용되지 않습니다 - 당신이 개체 컨텍스트에서 정적 메서드를 호출 할 수 없습니다. Jack이 아래에서 지적했듯이, 과 같이 객체 컨텍스트에서 정적 메서드를 호출 할 수 있습니다. OOP 패러다임의 모범 사례는 아니지만 허용됩니다.

+1

반대 *는 실제로 허용됩니다. 그게 좋은지 나쁜지 잘 모르겠다 ;-) –

+0

저에게 경고 해 주셔서 고마워요, 잭! 내 의견을 업데이트했습니다. – Andrew

6

그것은 수있어, 하지만 그것은 E_STRICT 경고 생성이 자동으로 허용 된 PHP의 이전 OO 구현에

Error #: 2048, Error: Non-static method MyClass::nonStatic() should not be called statically, assuming $this from incompatible context 

을하지만, 더 나은 관행 이후 채택되었다. 하지만 차질없이

반대 작품 :

class Test 
{ 
    function foo() 
    { 
     echo $this->bar(); 
    } 

    static function bar() 
    { 
     return "Hello world\n"; 
    } 
} 

$x = new Test; 
$x->foo(); 

Hello world을 인쇄합니다.

관련 문제