Используя статические свойства в PHP> = 4.3.0?

Отказ от ответственности: Да, я вынужден поддерживать PHP 4.3.0. Я знаю, что это мертво. Нет я не могу обновить его, потому что я имею дело с несколькими серверами, некоторые из которых у меня нет su доступа.

Ну, так как я не могу использовать self:: так как это PHP5 конкретный, как я должен пойти о реализации помех в классе PHP4? Так далеко от моего исследования кажется, что я могу, по крайней мере, использовать static ключевое слово кроме только в функциональном контексте, я видел другой метод, который использует $ _GLOBALS, но я не думаю, что буду использовать это.

Именно так мы находимся на той же странице, я должен получить доступ к этим помехам PHP5 в 4:

public static $_monthTable = array(
     31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
public static $_yearTable = array(
     1970 => 0,            1960 => -315619200);

До сих пор я придумал свою собственную функцию, которая в основном устанавливает статическую переменную, если Вы не найдены, и я hardcode все мои статические свойства в нее. Однако я не совсем уверен, как я могу сослаться на те помехи в рамках метода пыльника в том же классе, предположив, что он не инстанцируют, и никакой конструктор не уволен, подразумевая, что я не могу использовать $this.

class DateClass {

    function statics( $name = null ) {

        static $statics = array();

        if ( count( $statics ) == 0 ) {
            $statics['months'] = array(
                'Jan', 'Feb'
            );
        }

        if ( $name != null && array_key_exists($name, $statics ) ) {
            return $statics[$name];
        }
    }

};

var_dump( DateClass::statics('months') );

Вопрос № 1: действительно ли это выполнимо? Я должен попытаться использовать другой метод?

Вопрос № 2: Как я сослался бы на помехи из метода в том же классе? Я попробовал __CLASS__::statics но я думаю __CLASS__ просто строка, таким образом, я действительно не вызываю метод.

Примечание: Я буду реализовывать это в платформу, которая будет использоваться на Apache2 +/IIS6 +, PHP4.3.0 к PHP 5.2, OSX/Linux/Windows.

5
задан jam 6 March 2013 в 08:52
поделиться

2 ответа

Отвечая на ваш первый вопрос, я думаю, что ваше решение хорошее. Я бы продлил его, поэтому переменные также могут быть установлены и рассеяны. Я также бы также «премью» статическую стоимость $ по-разному, стоимость NULD DELAY DEFTORTORT на NULL .

<?php
class DateClass {
  function statics( $name, $value=null, $unset=null ) {
    static $statics;
    // better way to "prime" $statics, it's null by default
    if ( !$statics ) {
      $statics = array( "months" => array( "Jan", "Feb" ) );
    }
    if ( $value )
      $statics[ $name ] = $value;
    if ( $unset )
      unset( $statics[ $name ] );
    // don't worry about checking for existence
    // values of unset variables and array keys always are null
    // that's what you should return
    return $statics[ $name ];
  }
}

Что касается вашего второго вопроса, вы можете использовать DateClass :: statics () в любом месте, даже внутри других методов (статических или нет) DateClass . PHP4 также позволяет звонить DateClass :: Statics () , как метод экземпляра, даже если вы этого не должны делать. (Также возможно вызовите методы экземпляра статически, до тех пор, пока есть $ это во внешнем объеме. Это не красиво, и вы обязательно не делаете этого; -)

Если вы действительно хотите позвонить DateClass Быть более динамичным, вы можете использовать Call_user_func , это просто немного более многословного.

<?php
class DateClass {
  function statics( ... ) { ... }
  function anotherStaticFunc() {
    var_dump( DateClass::statics( 'months' ) );
    // using __CLASS__ and call_user_func
    var_dump(
      call_user_func( array( __CLASS__, 'statics' ), 'months' )
    );
  }
  function instanceMethod() {
    var_dump( $this->statics( 'months' ) );
  }
}
4
ответ дан 14 December 2019 в 13:37
поделиться

Как правило, это плохое представление об эмулировании языковых функций. Поскольку PHP 4 не поддерживает статические свойства, я бы не рекомендовал вам попробовать что-то умное, чтобы она появилась как если. Я бы сказал, что самая естественная вещь - использовать глобальные переменные. В основном вот в любом случае статическое свойство - это просто имен пространства. Итак, используйте имен-конвенцию, чтобы минимизировать риск насмешек и то же самое. Например. Вместо:

class Foo {
  static $ninja = 42;
}

Вы можете использовать

$GLOBALS['foo_ninja'] = 42;
2
ответ дан 14 December 2019 в 13:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: