试图在PHP中找出静态变量

时间:2014-11-07 22:22:11

标签: php variables object static

我有以下课程:

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 );
    }   
}

1 个答案:

答案 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"; 


}

关于为什么不使用::有很多争论 - 最简单的答案仅仅是出于设计目的,但是 - 以使用它们的方式使用运算符是很有意义的 - 并且无需调用新实例即可使用静态运算符 - 因此,在我看来,这足以让您从类中删除静态内容并使用->运算符。