簡體   English   中英

如何使用extract();自動將多個變量從父類傳遞給子類函數?

[英]How to pass multiple variables from parent class to child class functions automatically using extract();?

我不確定如何確切地編寫代碼,但是我可以肯定地說,我相信它比我的代碼表明的要好。

我想extract(); 我的父類中的var,並讓這些var可自動用於子類中的函數。

當前,我必須調用extract();。 每個子類函數中的var函數都可用。 這就是我要減少的內容,extract(); 每次在子類中調用一次。

我對__construct()還是一個新手。 我剛開始只是靜態調用函數的方法。 但是我試圖研究並弄清這一點,但是我只能在網上找到文章,展示如何將__varstruct傳遞給__construct();的其他函數。 我找不到任何有關如何一次傳遞多個變量的文章。 特別是使用extract();。

能做到嗎?

我的最終目標只是減少子類中每個var的“ parent :: ”的編寫。 因此,在需要時,我可以提取vars並直接編寫$var而不是parent::$var

// ----------------------------------------------------------------------------------------------------
// Concept One
// ----------------------------------------------------------------------------------------------------

class Parent_Vars {

    public static function get_vars() {

        $vars = array(
            'var_1' => 'var_1',
            'var_2' => 'var_2',
            'var_3' => 'var_3',
        );
        return $vars;

    }

}

class Parent_Vars extends class Child_Vars {

    public static $instance;

    static function getInstance() {
        if (!self::$instance) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function __construct() {
        parent::get_vars();
    }

    // This method DOES NOT work

    public static function echo_var_method_1() {

        //extract(parent::get_vars()); If I uncomment this, my vars below will work
        // But I don't want to call extract(parent::get_vars()); for every function I need. 
        //  I would like the vars to already be available from the __construct();
        echo $var_1; // returns error = undefined var
        echo $var_2; // returns error = undefined var
        echo $var_3; // returns error = undefined var
        echo parent::$var_1; // Works, but I'm trying to reduce writing parent:: everytime
        echo parent::$var_2; // Works, but I'm trying to reduce writing parent:: everytime
        echo parent::$var_3; // Works, but I'm trying to reduce writing parent:: everytime

    }

    // This method DOES work

    public static function echo_var_method_2() {

        extract(parent::get_vars()); // I'm trying NOT to call the var extract for each function, but for the whole class at once
        echo $var_1; // echoes "var_1" !! No need to write parent:: everytime for the vars
        echo $var_2; // echoes "var_2" !! No need to write parent:: everytime for the vars
        echo $var_3; // echoes "var_3" !! No need to write parent:: everytime for the vars

    }

}

$object = new Child_Vars();
Child_Vars::echo_var_method_1();
Child_Vars::echo_var_method_2();

// ----------------------------------------------------------------------------------------------------
// Concept Two - just slightly different with the parent class having its own __construct(); and the child __construct(); calling the parent __construct();
// ----------------------------------------------------------------------------------------------------

class Parent_Vars {

    public function __construct() {
        extract(self::get_vars());
    }

    public static function get_vars() {

        $vars = array(
            'var_1' => 'var_1',
            'var_2' => 'var_2',
            'var_3' => 'var_3',
        );
        return $vars;

    }

}

class Parent_Vars extends class Child_Vars {

    public static $instance;

    static function getInstance() {
        if (!self::$instance) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function __construct() {
        parent::__construct();
    }

    // This method DOES NOT work

    public static function echo_var_method_1() {

        //extract(parent::get_vars()); If I uncomment this, my vars below will work
        // But I don't want to call extract(parent::get_vars()); for every function I need. 
        //  I would like the vars to already be available from the __construct();
        echo $var_1; // returns error = undefined var
        echo $var_2; // returns error = undefined var
        echo $var_3; // returns error = undefined var
        echo parent::$var_1; // Works, but I'm trying to reduce writing parent:: everytime
        echo parent::$var_2; // Works, but I'm trying to reduce writing parent:: everytime
        echo parent::$var_3; // Works, but I'm trying to reduce writing parent:: everytime

    }

    // This method DOES work

    public static function echo_var_method_2() {

        extract(parent::get_vars()); // I'm trying NOT to call the var extract for each function, but for the whole class at once
        echo $var_1; // echoes "var_1" !! No need to write parent:: everytime for the vars
        echo $var_2; // echoes "var_2" !! No need to write parent:: everytime for the vars
        echo $var_3; // echoes "var_3" !! No need to write parent:: everytime for the vars

    }

}

$object = new Child_Vars();
Child_Vars::echo_var_method_1();
Child_Vars::echo_var_method_2();

當與OO一起使用時,提取物非常不可靠。 最好運行一個foreach並分配$ this-> $ key = $ value(因為它們無論如何都是動態的,您也可以使用魔術函數來創建getter和setter),這是更可取的選擇(並且執行時間更短)。 如果您堅持使用解壓縮,則應該在php手冊的同一extract()頁面上查找“ FredLawl”發表的評論。

更新:

class MyClass
{
    public function __construct($data)
    {
        foreach($data as $key => $value){
            $this->$key = $value
        }
    }
}

class MyClass2 extends MyClass
{
    public function __get($name) {
        return $this->$name;
    }
}

$instance = new MyClass2($variableArray);

$xtractedVar = $instance->variableKey;

您可以使用此基本原理來嘗試並找到所需的解決方案。

我認為您不太了解OO,並嘗試采用非OO的思維方式。 PHP(以及大多數其他基於類的OO語言)中的對象是數據的集合以及操作該數據的方法的關聯集合。 當創建給定類的子類時,將創建一種新的對象類型,該對象將擴展變量的集合和適用方法的集合。

您似乎也不太了解類變量(對所有類通用)和實例變量(其值對於給定的類實例是唯一的變量)之間的區別。

對於實例變量,子類可以通過$ this自動獲得任何非私有變量。

class SuperClass {
    protected $var = "";
    public function showVar ()
    {
        echo $this -> var . PHP_EOL;
    }

    public function setVal ($newVal)
    {
        $this -> var = $newVal;
    }
}

class SubClass extends SuperClass {
    public function showVarInString ()
    {
        echo "Hello, I'm a subclass with value " . $this -> var;
    }
}

$a = new SuperClass ();
$b = new SubClass ();
$a -> setVal (1);
$b -> setVal (4);
$a -> showVar (); // "1"
$b -> showVar (); // "4"
$b -> showVarInString (); // "Hello, I'm a subclass with value 4"

類變量(又名靜態變量)是類的所有實例所共有的,並且使用static ::而不是$ this進行訪問

class SuperClass
{
    protected static $var = 1234;
}

class SubClass extends SuperClass
{
    public function showVar ()
    {
        echo static::$var . PHP_EOL;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM