2011-11-22 5 views
11

저는 PHP에서 생성자가 어떻게 작동하는지 혼동합니다.PHP 생성자와 정적 함수

나는 새 객체를 인스턴스화 할 때 호출되는 생성자가있는 클래스가 있습니다.

$foo = new Foo($args); 

__construct($params)

클래스 Foo에이라고하며 적절한 초기화 코드를 실행합니다.

그러나 클래스를 사용하여 정적 함수를 호출하면 생성자가 다시 호출됩니다.

$bar = Foo::some_function(); //runs the constructor from Foo 

이 내가 새로운 Foo 객체를 생성 할 때 만 의도 된 개체 초기화 코드를 실행, 생성자가 실행됩니다.

생성자 작동 방법의 요점이 누락 되었습니까? 또는 정적 함수 호출을 만들 때 클래스를 사용할 때 __construct()이 실행되지 않도록하는 방법이 있습니까?

개체 초기화 대신 "팩토리"기능을 사용해야합니까? 그렇다면 생성자의 핵심은 무엇입니까?

:: EDIT :: 사용자가 사진을 앨범 (create_photo.php) 및 앨범을 볼 수있는 영역 (view_photos.php)에 업로드 할 수있는 양식이 있습니다. 양식 제출시 :

$photo = new Photo($_FILES['photo'], $_POST['arg1'], ect..); 

사진 생성자가 사진을 만들고 저장합니다. 그러나 view_photo.php에서, 내가 전화 할 때 :

$photo = Photo::find_by_id($_POST['id']) //user-defined function to query database 

이 사진의 생성자가 실행하는 원인이되는!

+8

옳지 않을 수 있습니다. 정적 호출로 생성자가 호출되는 전체 코드를 제공하십시오! – mAu

+0

실제 코드를 보여주십시오. 당신이 쓴 것이 정확하지 않습니다. –

+0

생성자는 어떤 동작을 수행한다고 판단합니까? – markus

답변

16

귀하의 질문에 대한 답을 찾을 수 없습니다.

참조 데모 : http://codepad.org/h2TMPYUV

코드 :

class Foo { 
    function __construct(){ 
     echo 'hi!'; 
    } 
    static function bar(){ 
     return 'there'; 
    } 
} 

echo Foo::bar(); //output: "there" 
+2

그게'__construct()'가 아니겠습니까? 그 결과는 동일합니다 ... – jeroen

+0

@jeroen fixed^_^nice catch – Neal

6

가정 PHP 5.우리는 새로운 객체 PHP 호출을 만들 수 있기 때문에 X

다른 목표, 다른 경로

  1. 클래스 (객체)의 새로운 인스턴스

    class myClassA 
    { 
        public $lv; 
    
        public function __construct($par) 
        { 
         echo "Inside the constructor\n"; 
         $this->lv = $par; 
        } 
    } 
    
    $a = new myClassA(11); 
    $b = new myClassA(63); 
    

    을 만듭니다

    __construct($par)을; 그래서 새 개체의

    :

    $a->lv == 11 
    
    $b->lv == 63 
    
  2. 클래스

    class myClassB 
    { 
        public static $sv; 
    
        public static function psf($par) 
        { 
         self::$sv = $par; 
        } 
    } 
    
    myClassB::psf("Hello!"); 
    $rf = &myClassB::$sv; 
    myClassB::psf("Hi."); 
    

    의 기능을 사용하려면 지금 $rf == "Hi."

    기능 또는 variabiles해야 ::에 액세스 할 정적 정의, "psf", "클래스 변수"를 호출하는 객체가 생성되지 않았습니다. sv에는 onl이 있습니다. 클래스 내의 인스턴스 1.

  3. 우리 $ 파 세트를 갖는 새로운 객체를 생성 팩토리 (의 getInstance) 처음 사용

    class myClassC 
    { 
    
        private static $singleton; 
    
        public static function getInstance($par){ 
    
         if(is_null(self::$singleton)){ 
    
          self::$singleton = new myClassA($par); 
    
         } 
    
         return self::$singleton; 
    
        } 
    
    } 
    
    $g = myClassC::getInstance("gino"); 
    echo "got G\n"; 
    
    $p = myClassC::getInstance("pino"); 
    echo "got P\n"; 
    

(myClassA 위이다)이 공장에 의해 생성 된 단일를 사용 gino.

공장에서 두 번째로 $ singleton 값을 반환합니다. 새로운 객체가 생성되지 않습니다 (__construct이 호출되면 더 적은 메모리 & cpu가 사용됨).

물론 값은 myClassA instanceof를 객체 이며, 잊지 마세요 : 싱글에

myClassC::$singleton->lv == "gino"

에주의 :

What is so bad about singletons?

http://www.youtube.com/watch?v=-FRm3VPhseI

을함으로써 내 ans 나는 싱글 톤을 승격/강등하고 싶지 않다. 질문의 단어에서 간단히이 계산을 만들었습니다.

"static"+ "__ construct"= "singleton"! 내가 정적 클래스의 방법 construct()을 넣어

:

+0

싱글 톤 및 관련 클래스에 대한 면책 ​​조항을 추가해야합니다. http://stackoverflow.com/questions/137975/what-is-so-bad -about-singletons 및 http://www.youtube.com/watch?v=-FRm3VPhseI –

+0

$ g = myClassC :: getInstance ("gino"); 그리고 나서 $ p = myClassC :: getInstance ("pino"); , $ g-> lv 및 $ p-> lv 값은 같은 = "gino"입니다. 왜냐하면 생성자는 오직 한 번만 실행되기 때문입니다! – Miguel

1

은 여기 내 해결입니다. 공지 사항은 일반 수업에서 사용하는 __construct()과 다릅니다.

각 클래스는 고유 한 파일이므로 클래스를 처음 사용할 때 해당 파일을 게으르게로드합니다.이것은 저에게 클래스의 첫 번째 사용 이벤트를 제공합니다.

spl_autoload_register(function($class) { 

    include_once './' . $class . '.php'; 

    if (method_exists($class, 'construct')) { 
     $class::construct(); 
    } 
});