Как я должен восполнить отсутствие статических инициализаторов в PHP? - PullRequest
3 голосов
/ 15 сентября 2009

Я думаю о том, чтобы поместить каждый класс в отдельный файл и выполнить статическую инициализацию вне определения класса.

Проблема с этим заключается в том, что инициализация произойдет до того, как указанный класс действительно понадобится (это произойдет, когда файл, содержащий класс, будет включен впервые). Это проблема, потому что может случиться так, что класс вообще не будет использоваться, поэтому инициализация не нужна. И я думаю, что практика включения использованных файлов не в начало вашего кода - просто грязная техника.

Если у кого-нибудь есть жизнеспособное решение этой проблемы, я был бы очень признателен.

Ответы [ 5 ]

3 голосов
/ 29 октября 2010

Единственный ответ имеет проблему здесь ... если вы используете статические методы до создания экземпляра класса ... тогда статический инициализатор не запустился ... так что вы можете сказать, что можно запустить инициализатор в каждом статическом методе ... это правда, но как насчет просто получения и установки статических переменных ... Я полагаю, что для этого можно также использовать магические функции __get и __set ... есть проблема с языком в том, что он делает не поддерживается статическая инициализация ... вот как это можно сделать ...

в файле Hi.php:

class Hi{
public static $v = "0";
}

Hi::$v= "2";
// end of Hi.php file

просто используйте файл .php для каждого класса ... и выполняйте статическую инициализацию вне определение класса ...

3 голосов
/ 15 сентября 2009

Взгляните на такой код. Он использует единственный экземпляр базы данных, но вы все равно можете создавать экземпляры класса:

class DB
{
    private static $_db;

    public static function pdo()
    {
        if (is_null(self::$_db))
        {
            self::$_db=new PDO('pgsql:host=localhost;
                                port=5432;
                                dbname=testdb;
                                user=postgres;
                                password=abc123');
            self::$_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }

        return self::$_db;
    }

public static function factory()
{
    return new self;
}

private function __construct() {}

Когда вы хотите экземпляр БД, вы делаете DB::factory(). БД использует self::pdo(), чтобы вернуть синглтон для доступа к базе данных.

2 голосов
/ 15 сентября 2009

Вы можете искать __autoload, когда класс не найден, он вызывается и должен включать файл, содержащий этот класс. Вы можете поместить статические инициализаторы в эту функцию.

0 голосов
/ 26 мая 2010

Вот как я это делаю. Единственная цена - это проверка статического члена $ doneinit каждый раз, когда вы создаете.

class Foo {
   private static $doneinit=false;

   private static init() {
      // do static initialisation here

      self::$doneinit=true;
   }

   public function __construct() {
      if (!self::$doneinit) self::init();

      // go on to do the rest of construction
   }
}

Простой, и он держит все в классе.

0 голосов
/ 15 сентября 2009

Использовать шаблон синглтона вместо статических вызовов:

<?php
class Foo {

   protected static $_instance;

   /**
   * @return Foo
   */
   public static function getInstance() {
        return (null === self::$_instance)? 
            self::$_instance :
            self::$_instance = new Foo();
   }

   protected function __construct() {
        // initialize here
   }
}
...