Php 如何使用extract()将多个变量从父类自动传递到子类函数;?

Php 如何使用extract()将多个变量从父类自动传递到子类函数;?,php,class,oop,variables,global-variables,Php,Class,Oop,Variables,Global Variables,我不知道如何准确地编写代码,但我可以肯定地说,我相信这比我的代码所表明的要好 我希望从父类中创建变量,并使这些变量自动可用于子类中的函数 目前,我必须调用extract();每个子类函数中的函数,以使变量可用。这就是我想要减少的,摘录();每次只调用子类中的一次 我对_构造()还是个新手;方法,因为我一开始只是静态调用函数。但我试图研究并理解这一点,但我只在网上找到了一些文章,展示了如何将单变量从_construct()传递给其他函数;。我没有找到任何关于如何同时通过多个变量的文章。特别是使用e

我不知道如何准确地编写代码,但我可以肯定地说,我相信这比我的代码所表明的要好

我希望从父类中创建变量,并使这些变量自动可用于子类中的函数

目前,我必须调用extract();每个子类函数中的函数,以使变量可用。这就是我想要减少的,摘录();每次只调用子类中的一次

我对_构造()还是个新手;方法,因为我一开始只是静态调用函数。但我试图研究并理解这一点,但我只在网上找到了一些文章,展示了如何将单变量从_construct()传递给其他函数;。我没有找到任何关于如何同时通过多个变量的文章。特别是使用extract()

这能做到吗

我的最终目标只是减少子类中每个变量的“父::”写入。因此,当需要时,我可以提取变量并简单地编写
$var
,而不是
父项::$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一起使用时,extract是非常狡猾的。运行foreach并分配$this->$key=$value(因为它们是动态的,所以您也可以使用神奇的函数来创建getter和setter)会更明智(而且执行时间也更快)。如果您坚持使用extract,您应该在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;

你可以利用这一基本原则来解决问题,找到你需要的解决方案。

我认为你对面向对象的理解不是很好,正在尝试应用非面向对象的思维方式。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;
    }
}

我不太确定您想要实现什么,但我的第一印象是这确实是非常糟糕的OO实践(事实上,到处都会出现static关键字,这可能根本不是OO!静态方法是试图将非OO思维应用于OO模型的代码味道)。如果在超类中声明变量,那么它在子类中自动可用(除非声明为私有)。没有必要使用extract,也绝对不推荐使用extract。我应该补充一点,我不想让这些全局变量在任何地方都可用,只在需要时对子类及其函数可用。我希望这是有意义的。我不确定PHP是如何收集变量的,但根据我每次调用extract()时的理解;php将提取所有这些变量。我不想这样做的时候,只有几个变量可以从提取使用。因此,我希望尽可能减少对提取的调用,这就是为什么我希望在需要时为整个类调用一次提取。希望这是有道理的哦,好的。刚刚看到你的反应@gordonm表示OO static关键字。我知道,正如我所说,我开始只静态调用函数,因为我还没有完全理解obj逻辑。但我知道,构造可以使某些东西在实例创建时自动可用,所以这就是我尝试构造的逻辑。但最终我只希望我提取的变量对我的子类函数可用。为什么不创建一个在数组中查找的
\uu get
方法,而不是将它们提取到变量中呢?@Barmar为此,我可以调用
parent::
,这是我已经在做的事情。我已经将我所有的var作为公共静态$var;但我试图找到一种方法将所有这些变量拉到另一个类中,而不必编写parent::$var。这只是因为我注意到parent::$var变得非常重复。这可能不是什么大问题,但我有这个想法并想深入研究,特别是因为我没有找到关于这个概念的文章,但也许这就是为什么,哈哈。如果这是不可取的,那么我不想这样做,也不想学习如何这样做。我还在学习,所以这只是我的想法和我的知识。你能给我一个你想尝试的代码示例吗?更快的执行速度也是我想要的,并且我注意到代码变得重复,所以我试图减少代码。现在,我将每个$var作为父调用::$var,我尝试只编写$var,但也可以在需要时通过一次调用将所有这些$var都提供给类。从理论上讲,直接调用parent:$var是否更快?好的。我提到了非OO技能集,因为我只使用类来保护函数,使用更通用的函数名,并将某些类元素扩展到子类。我没有使用_construct(),因为我还不理解它。我已经看了好几遍了,但我还不明白它,也看不出它是我所做的事情的目的。我不能按原样使用$this,因为我总是得到错误。。。不在对象上下文中时使用$this。。。我将坚持我当时正在做的事情,并在稍后再次查看OOP。而且我的VAR必须公开,否则会出错,所以我理解这一点。我试图写一些与我实际想要实现的目标更相关的代码。