Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP的扩展类中使用父变量_Php_Class_Object_Extends - Fatal编程技术网

在PHP的扩展类中使用父变量

在PHP的扩展类中使用父变量,php,class,object,extends,Php,Class,Object,Extends,我有两个班,主要班和扩展班。我需要在扩展类中使用主变量 <?php class Main { public $vars = array(); } $main = new Main; $main->vars['key'] = 'value'; class Extended extends Main { } $other = new Extended; var_dump($other->vars); ?> 谁能帮我 无效,例如: <?php cla

我有两个班,主要班和扩展班。我需要在扩展类中使用主变量

<?php
class Main {
  public $vars = array();
}

$main = new Main;

$main->vars['key'] = 'value';

class Extended extends Main { }

$other = new Extended;

var_dump($other->vars);

?>

谁能帮我

无效,例如:

<?php
class Extended extends Main {
  function __construct ($main) {
    foreach ($main as $k => $v) {
      $this->$k = $v;
    }
  }
}
?>


我需要一些更透明、更高效的解决方案:)

编辑:使用控制反转(IoC)和依赖注入(DI)可以更好地解决这一问题。如果您使用自己的框架或没有依赖注入容器的框架,请尝试

下面的答案是愚蠢答案的历史


我认为这是正确的方式

<?php
class Config {
    protected $_vars = array();

    protected static $_instance;

    private function __construct() {}

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

    public function &__get($name) {
        return $this->_vars[$name];
    }

    public function __set ($name, $value) {
        $this->_vars[$name] = $value;
    }
}

$config = Config::getInstance();
$config->db = array('localhost', 'root', '');
$config->templates = array(
    'main' => 'main',
    'news' => 'news_list'
);

class DB {
    public $db;

    public function __construct($db)
    {
        $this->db = $db;
    }

    public function connect()
    {
        mysql_connect($this->db[0], $this->db[1], $this->db[2]);
    }
}

$config = Config::getInstance();
$db = new DB($config->db);
$db->connect();

class Templates {
    public $templates;

    public function __construct($templates)
    {
        $this->templates = $templates;
    }

    public function load ($where) {
        return $this->templates[$where];
    }
}

$config = Config::getInstance();
$templates = new Templates($config->templates);
echo $templates->load('main') . "\n";

我想你需要更清楚你想要什么。假设您有几个Main和Extended的实例。它们是否都应该引用相同的数据,这样,如果您更改其中任何一个中的数据,它们都会受到影响

如果是这样,那么一种方法是使用静态变量,该变量绑定到类而不是单个实例。另一种方法是创建一个单独的对象(属于不同的类)来存储数据,并在创建主类和扩展类时将其传递给它们。它们可以各自存储对它的引用,例如:

class Main {
   public $data;
   function __construct(Data $data) {
     $this->data = $data;
   }
}
class Extended extends Main {}

$ourData = new Data();
$ourData->vars = array(1,2,3);

$main = new Main($ourData);
$other = new Extended($ourData);

如果不是,则需要数据的副本,而不是对同一数据的引用。在这种情况下,您的第二个示例更接近,尽管我不会盲目复制所有成员。

oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

你想要这个:

class Config
{
    private $m_vars = array();

    function __get($name)
    {
        return $this->m_vars[$name];
    }

    function & __set($name, $value) // << the & is important!
    {
        $this->m_vars[$name] = $value;
    }
}

class Db
{
    funciton __construct(Config $config)
    {
        $this->Connect($config->host, $config->user, $config->pass, $config->db);
    }
}

$config = new Config();
$config->host = "localhost";
...
$db = new Db($config);

我知道这是非常古老的,但万一其他人需要线索

你考虑过使用静态变量吗

PHP OOP设计模式使得父类中静态声明的变量在子类中也保持不变

例如

<?php
class A {
    public static $test = 'a';

    public function test() {
        echo 'Test is: '.self::$test;
    }

}
class B extends A {
    public static $test = 'b';
}
$obj = new B;
$obj->test();
?>
您还可以创建一个神奇的方法,根据您请求实例的内容(即方法或变量),动态地抛出self:::$变量。在任何情况下,您都可以将代码连接起来以抛出self::$变量等价物

阅读更多关于各种神奇方法的信息,这些方法可以让你做这类事情


操作有点神秘,所以我不确定这是否正是您想要的,但我没有看到这里有任何其他人引用静态变量,所以我想我会插话-希望它有帮助

用一个简单的构造函数就很容易做到

<?php

class One {

    public static $string = "HELLO";

}

class Two extends One {

    function __construct()
    {
        parent::$string = "WORLD";
        $this->string = parent::$string;
    }

}

$class = new Two;
echo $class->string; // WORLD

?>


我希望那个不懂PHP的家伙能解释一下原因。我不想去downmod,但你在OOP设计方面真的很欠缺。您不应该扩展配置类-配置对象应该包含在使用它们的对象中-而不是扩展到其他类中。对不起,这太傻了。我不这么做,但那是他想要的。它一开始并不是一个配置类,但事实证明它是这样的……只要对永远愚蠢说不:)我一点也不怪OP,但我们应该更清楚地指出OP做了一个糟糕的设计选择,如果他把整个代码结构都建立在这个“反模式”的基础上,它会狠狠地咬他的屁股:)Redid以反映这是一个配置类,而不是它开始时的某个随机主类。我不明白。我很乐意回答你的问题,但还不够清楚。你想像($obj=newextended($main))那样构造“extended”,还是在寻找静态变量?很有趣。但是如果在_construct()方法中声明并分配$test,会发生什么呢?我这样问是因为你不能做公共静态$this->test;
public function get_variable() {
    return self::$variable;
}
<?php

class One {

    public static $string = "HELLO";

}

class Two extends One {

    function __construct()
    {
        parent::$string = "WORLD";
        $this->string = parent::$string;
    }

}

$class = new Two;
echo $class->string; // WORLD

?>