Отказ от ответственности: Да, я вынужден поддерживать 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.
Отвечая на ваш первый вопрос, я думаю, что ваше решение хорошее. Я бы продлил его, поэтому переменные также могут быть установлены и рассеяны. Я также бы также «премью» статическую стоимость $ по-разному, стоимость 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' ) );
}
}
Как правило, это плохое представление об эмулировании языковых функций. Поскольку PHP 4 не поддерживает статические свойства, я бы не рекомендовал вам попробовать что-то умное, чтобы она появилась как если. Я бы сказал, что самая естественная вещь - использовать глобальные переменные. В основном вот в любом случае статическое свойство - это просто имен пространства. Итак, используйте имен-конвенцию, чтобы минимизировать риск насмешек и то же самое. Например. Вместо:
class Foo {
static $ninja = 42;
}
Вы можете использовать
$GLOBALS['foo_ninja'] = 42;