PHP는

2015-01-16 2 views
-1

나는 자바에서이에 대한 몇 가지 질문을 읽었습니다하지만 난 PHP에서 원하는 내용을 찾을 수 없음 -이 매우 가까웠지만 : php static methods question
Call method non-static with static in PHPPHP는

static 내에서 비 ​​정적 메서드를 호출 할 수 있습니까?

다음과 같은 세션 클래스 (session::init()이 있음)가 있지만 오류 메시지가 표시되지 않도록하는 방법을 배울 수 없습니다. 그래서 정적 또는 공개 할 필요가 없습니다 - -

<?php 
class session { 

    public static function init(){ 
    if (**QUERY HERE**_is_session_started() === FALSE) { 
//  if (session_status() == PHP_SESSION_NONE) { 
      @session_start(); 
     } else { 
      echo "Session already started<br/>"; 
     } 
    } 


private function _is_session_started() { 
    if (php_sapi_name() !== 'cli') { 
     if (version_compare(phpversion(), '5.4.0', '>=')) { 
      return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE; 
     } else { 
      return session_id() === '' ? FALSE : TRUE; 
     } 
    } 
    return FALSE; 
} 

} 

나는 단지 이제까지 _is_session_started 기능은 init() 함수에 의해 호출하려는하지만 난 그것을 참조하는 방법을 모르겠어요.

나는 여기QUERY '자기 ::'페이지가로드를 교체,하지만 난이 오류가 나타나면 :

PHP Strict Standards: Non-static method session::_is_session_started() should not be called statically in /Applications/MAMP/htdocs/mvc/libs/session.php on line 5 

을하지만 $ this-를 사용하여 비 정적 방법을 참조하려고하면 > _is_session_started() 정적 init() 함수가 세션 클래스를 인스턴스화하지 않았기 때문에 치명적인 오류가 발생합니다.

그래서 나는 이것을 할 다른 방법이있을 것이라고 생각하고 있습니다. _is_session_started 메소드를 정적으로 만들거나, init 함수를 더 길게 만들 수는 있습니다 만, 이것이 왜 그런지 이해하고 싶습니다. 그것은 어떤 이해가되지 않습니다

+0

로 전화하면 [정역학을 사용하여 귀하의 테스트 용이성을 죽이지 방법] 읽을 수 있습니다 (http://kunststube.net/static/는) – deceze

답변

2

덕분에 정적 하나의 비 정적 메서드를 호출 할 수 있습니다. 비 정적 메서드를 호출하려면 개체 인스턴스이 필요합니다. 메서드를 정적으로 호출하면 개체 인스턴스가 없습니다. 불일치가 분명하기를 바랍니다.

class Foo { 

    public $bar; 

    public function baz() { 
     echo $this->bar; 
    } 

} 

$a = new Foo; 
$b = new Foo; 

$a->bar = 'Hello'; 
$b->bar = 'World'; 

$a->baz(); 
$b->baz(); 

$this 키워드가 여기에 특별한 소스입니다 :

비 정적 방법의 점은 인스턴스 별 데이터에 액세스 할 수 있다는 것입니다. 함수가 $this을 사용하고 개체 인스턴스를 필요로

Foo::baz(); // now what? 

경우, 정적으로 호출 할 수 없습니다 : 당신이 정적 메서드에 개체 인스턴스를 가지고 있지 않기 때문에, 즉 어떤 $this, 당신은 비 정적 메서드를 호출 할 수 없습니다. 함수가 $this을 사용하지 않고 객체 인스턴스가 필요하지 않은 경우 static으로 만들고 정적으로 호출합니다.

+0

는 것 같은데 대답은 불가능하다는 것입니다. 흥미 롭군요. 그리고 논리를 이해합니다. 가능하다면 정적 메서드를 해체하고 싶었을 것입니다. 대신에 모든 메서드를 하나의 메서드로 결합해야합니다. – Simeon

+0

그건 내가 말한 것이 아니야. 메소드가 정적 인 경우 (즉, '$ this'를 사용하지 않는 경우) 정적으로 호출합니다 (예 :'self :: foo()') ** **'static' 키워드로 표시 ** – deceze

+0

알립니다. 고맙습니다. – Simeon

0

_is_session_started 메서드를 정적으로 선언해야합니다.

private static function _is_session_started() { 

그리고 BTW

self::_is_session_started(); 
+2

정적 함수는 공개 일 필요가 없습니다. static 함수가 (다른 public static 함수로부터의) 클래스 자체에 의해서만 내부적으로 호출된다면 public이되어서는 안됩니다. – deceze

+0

고마워,하지만 원래 게시물에서 정적으로 선언하도록 변경할 수 있다고 언급했는데, init 메소드 내에서이 두 번째 메소드를 호출하기 때문에 쿼리하고있다. (나는 세션 :: _ is_session_started를 절대 수행하지 않을 것이다.) 그래서 나는 그 일을하는 가장 좋은 방법을 찾고있다. – Simeon

+0

네가 맞아, 나는 대답을 바꾸었다. – Guillermo