[php] PHP에서 정적 클래스를 만들 수 있습니까 (C # 에서처럼)?

PHP에서 정적 클래스를 만들고 C #에서와 같이 동작하도록하고 싶습니다.

  1. 생성자는 클래스를 처음 호출 할 때 자동으로 호출됩니다.
  2. 인스턴스화가 필요하지 않습니다

이런 종류의 …

static class Hello {
    private static $greeting = 'Hello';

    private __construct() {
        $greeting .= ' There!';
    }

    public static greet(){
        echo $greeting;
    }
}

Hello::greet(); // Hello There!



답변

PHP에서 정적 클래스를 가질 수 있지만 생성자를 자동으로 호출하지는 않습니다 (시도하고 호출 self::__construct()하면 오류가 발생합니다).

따라서 initialize()함수 를 작성하여 각 메소드에서 호출해야합니다.

<?php

class Hello
{
    private static $greeting = 'Hello';
    private static $initialized = false;

    private static function initialize()
    {
        if (self::$initialized)
            return;

        self::$greeting .= ' There!';
        self::$initialized = true;
    }

    public static function greet()
    {
        self::initialize();
        echo self::$greeting;
    }
}

Hello::greet(); // Hello There!


?>


답변

Greg의 답변 외에도 클래스를 인스턴스화 할 수 없도록 생성자를 private으로 설정하는 것이 좋습니다.

내 겸손한 견해로는 이것이 Greg의 사례를 기반으로 한 더 완벽한 예입니다.

<?php

class Hello
{
    /**
     * Construct won't be called inside this class and is uncallable from
     * the outside. This prevents instantiating this class.
     * This is by purpose, because we want a static class.
     */
    private function __construct() {}
    private static $greeting = 'Hello';
    private static $initialized = false;

    private static function initialize()
    {
        if (self::$initialized)
            return;

        self::$greeting .= ' There!';
        self::$initialized = true;
    }

    public static function greet()
    {
        self::initialize();
        echo self::$greeting;
    }
}

Hello::greet(); // Hello There!


?>


답변

“정적”과 같은 클래스를 가질 수 있습니다. 하지만 정말 중요한 것이 빠져 있다고 가정합니다 .php에는 앱 사이클이 없으므로 전체 응용 프로그램에서 실제 정적 (또는 싱글 톤)을 얻지 못합니다 …

PHP에서 싱글 톤 참조


답변

final Class B{

    static $staticVar;
    static function getA(){
        self::$staticVar = New A;
    }
}

b의 구조는 단일 처리기라고하며 a에서도 할 수 있습니다.

Class a{
    static $instance;
    static function getA(...){
        if(!isset(self::$staticVar)){
            self::$staticVar = New A(...);
        }
        return self::$staticVar;
    }
}

이것은 싱글 톤 사용입니다
$a = a::getA(...);


답변

나는 일반적으로 정적이 아닌 일반 클래스를 작성하고 팩토리 클래스를 사용하여 객체의 단일 (sudo static) 인스턴스를 인스턴스화하는 것을 선호합니다.

이 방법으로 생성자와 소멸자가 정상적으로 작동하며 원하는 경우 추가 비 정적 인스턴스를 만들 수 있습니다 (예 : 두 번째 DB 연결)

나는 이것을 항상 사용하며 페이지가 종료되면 소멸자가 세션을 데이터베이스로 푸시하므로 사용자 지정 DB 저장소 세션 처리기를 만드는 데 특히 유용합니다.

또 다른 장점은 모든 것이 필요할 때 설정되므로 호출하는 순서를 무시할 수 있다는 것입니다.

class Factory {
    static function &getDB ($construct_params = null)
    {
        static $instance;
        if( ! is_object($instance) )
        {
            include_once("clsDB.php");
            $instance = new clsDB($construct_params);   // constructor will be called
        }
        return $instance;
    }
}

DB 클래스 …

class clsDB {

    $regular_public_variables = "whatever";

    function __construct($construct_params) {...}
    function __destruct() {...}

    function getvar() { return $this->regular_public_variables; }
}

당신이 그것을 사용하고자하는 곳은 그냥 전화 …

$static_instance = &Factory::getDB($somekickoff);

그런 다음 모든 메소드를 정적이 아닌 것으로 취급하십시오.

echo $static_instance->getvar();


답변

객체를 정적으로 정의 할 수는 없지만 작동합니다.

final Class B{
  static $var;
  static function init(){
    self::$var = new A();
}
B::init();


답변