PHP에서 정적 클래스를 만들고 C #에서와 같이 동작하도록하고 싶습니다.
- 생성자는 클래스를 처음 호출 할 때 자동으로 호출됩니다.
- 인스턴스화가 필요하지 않습니다
이런 종류의 …
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();