У меня есть следующий класс:
class cls_Tip extends cls_getTips {
public static $result = null;
public static $event = null;
public static $market = null;
public static $participant = null;
public function __construct() {
}
public static function grab( $id ) {
global $wpdb;
$query = " SELECT * FROM " . $wpdb->prefix . "asp_tips WHERE id = '" . $id . "';";
$result = $wpdb->get_row( $query );
self::$result = $result;
}
public static function add_element_to_parent_array(){
parent::add_array_ellement( self::$result );
}
public static function return_static_variable( $variable_name ) {
return self::${ $variable_name };
}
public static function get_event() {
new cls_Event;
cls_Event::grab( self::$result->markets_id );
cls_Event::add_static_variable_to_parent();
}
public static function get_market() {
new cls_Market;
cls_Market::grab( self::$result->markets_id );
cls_Market::add_static_variable_to_parent();
}
public static function get_participant() {
new cls_Participant;
cls_Participant::grab( self::$result->participants_id );
cls_Participant::add_static_variable_to_parent();
}
public static function add_static_variable( $variable_name, $class ) {
self::${ $variable_name } = $class;
}
}
Когда я начинаю этот класс следующим образом:
new cls_Tip;
cls_Tip::get( $record->id );
cls_Tip::get_participant();
$p = cls_Tip::return_static_variable( 'participant' );
… это работает, но $ p продолжает иметь то же значение после создания еще одного ‘нового cls_Tip’, как описано выше (в цикле.)
Это потому, что статическая переменная может быть установлена только один раз? И что бы вы порекомендовали сделать в этом случае?
Большое спасибо за ваш совет.
С наилучшими пожеланиями,
Джорджио
PS: вот класс cls_Participant:
class cls_Participant extends cls_Tip {
public static $result = null;
public function __construct() {
}
public static function grab( $id ) {
global $wpdb;
$query = " ... ";
$result = $wpdb->get_row( $query );
self::$result = $result;
}
public static function add_static_variable_to_parent() {
parent::add_static_variable( 'participant', self::$result );
}
}
Итак, вы видите, что когда вы вызываете статические свойства / методы класса, если вы явно не обрабатываете создание экземпляров внутри вызываемой функции, «статический» экземпляр является совершенно отдельным экземпляром от экземпляра, который был создан —
Таким образом, вы должны сделать это:
$class = new cls_Tip;
$class::get( $record->id );
$class::get_participant();
$p = $class::return_static_variable( 'participant' );
И это должно дать вам поведение, которое вы ожидаете …
Однако в этом случае вам не нужно использовать статические методы / свойства … вы можете сделать:
$class = new cls_Tip;
$class->get( $record->id );
$class->get_participant();
$p = $class->return_static_variable( 'participant' );
Кроме того, это эквивалентно в вашей последней строке:
$p = cls_Tip::$participant
Вам не нужна функция получения, так как свойство является общедоступным …
НО, чтобы проиллюстрировать мой ответ, сделайте так:
cls_Tip::$result = "Static Result";
$alt = new cls_Tip();
$alt::$result = "Instantiated Property";
echo cls_Tip::$result;
echo $alt::$result;
Итак, в конечном счете, урок здесь заключается в том, что если у вас будет несколько отдельных экземпляров класса, вам не обязательно помечать все как static
—
Похоже, в этой теме много разговоров — некоторые люди говорят, что вы почти никогда не должны использовать статические методы / свойства в PHP, хотя в некоторых случаях они, кажется, занимают надлежащее место.
Однако, по моему личному мнению, вам было бы лучше убрать все статические вещи из вашего класса, который будет иметь несколько экземпляров.
Таким образом, вы бы в конечном итоге использовать ->
оператор вместо статического ::
оператор.
Случай, когда ::
Оператор был бы более уместным, если бы вы хотели иметь статический класс, управляющий всеми вашими экземплярами, который может выглядеть следующим образом …
class clp_Tip{
static private $instances;
//[...]
public static function new_instance($name){
return self::$instance[$name] = new $this;
}
public static function get_instances(){
return self::$instances;
}
//[...]
}//[...]
// example:
$classOne = cls_Tip::new_instance('name');
$classTwo = cls_Tip::new_instance('two');
echo count(cls_Tip::get_instances()); // 2
$classOne->doSomeFunction();
$classOne->someProperty = "foo";}
Есть много споров о том, почему бы не использовать ::
— самый простой ответ — просто для целей проектирования, но — имеет смысл использовать операторы так, как они были созданы для использования —
и статические операторы были созданы для использования без вызова нового экземпляра —
Так что, на мой взгляд, это достаточно веская причина, чтобы удалить статические вещи из вашего класса и использовать ->
оператор.
Других решений пока нет …