programing

(C#과 같이) PHP로 스태틱클래스를 만들 수 있습니까?

kingscode 2022. 10. 19. 21:24
반응형

(C#과 같이) PHP로 스태틱클래스를 만들 수 있습니까?

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!


?>

그렉의 대답 외에 컨스트럭터를 비공개로 설정하여 클래스를 인스턴스화할 수 없도록 하는 것이 좋습니다.

그래서 제 소견으로는 이것은 그렉의 사례를 바탕으로 한 보다 완벽한 예입니다.

<?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에서 Singleton 참조

final Class B{

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

b의 구조는 singeton 핸들러를 호출하는 것입니다. 당신은 또한 그것을 할 수 있습니다.

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();

언급URL : https://stackoverflow.com/questions/468642/is-it-possible-to-create-static-classes-in-php-like-in-c

반응형