我有以下课程:
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' );
...它有效,但在创建了另一个新的cls_Tip'之后,$ p继续具有相同的价值。如上所述(循环中)。
这是因为静态变量只能设置一次吗?在这种情况下你会建议做什么?
非常感谢你的建议。
致以最诚挚的问候,
乔治
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 );
}
}
答案 0 :(得分:1)
嗯,你看,当你调用类的静态属性/方法时,除非你明确地处理你调用的函数内部的实例化,否则"静态" instance是与实例化的实例完全独立的实例 -
因此,你应该这样做:
$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
您不需要getter功能,因为该属性是公开的......
但是,为了进一步说明我的答案,请执行以下操作:
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";
}
关于为什么不使用::
有很多争论 - 最简单的答案仅仅是出于设计目的,但是 - 以使用它们的方式使用运算符是很有意义的 -
并且无需调用新实例即可使用静态运算符 -
因此,在我看来,这足以让您从类中删除静态内容并使用->
运算符。