PHPの拡張クラスで親変数を使用します
質問
私は2クラス、メインと拡張を持っています。私は、拡張クラスでメインVARSを使用する必要があります。
<?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";
他のヒント
これは、簡単なコンストラクタで容易に可能である。
<?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オブジェクト指向のデザインパターンは、静的で変数を宣言するようなものであるの親はクラスが同じままで、の子のクラス、あまりにます。
たとえば...
<?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();
?>
(PHP 5.3-に私はそれがあまりにも、他のバージョンも同じだと確信しています)あなたは次のような結果が得られます。このコードを実行します
の のテストは、次のとおりです。のの
私はあなたのOPに集まることができるものから、あなたはの親クラス変数のために方法を探しているのままに - でも、拡張されたクラスで。これは、その問題を解決します。
(つまり、あなたは通常、の$ obj->がのvarsの書き込みたい場合)、あなたはself::$variable_name
を参照する親クラスの関数を作成する必要があると思い、クラススコープの外で公に変数を呼び出すにはそれはそのクラス、またはそれを拡張する他のクラスのいずれかを利用したコードに戻って、その変数を投げることができるようにます。
たとえば、何かます:
public function get_variable() {
return self::$variable;
}
すなわち、メソッドや変数 - また、動的にあなたがインスタンスを尋ねるものに基づいて自己:: $変数を投げ返すだろう魔法のメソッドを作成することができます。あなたはどのような場合には自己:: $変数と同等のバックスローするコードを配線することができます。
http://php.net/manual/en/languageをお読みください。 oop5.magic.phpあなたが原料のこの種を行うことができ、様々な魔法の方法に関する詳しい情報は、を。
OPは少し不可解だったので、私はそれはあなたが望んでいたまさにだかどうかわからなかったが、私はここに誰が静的変数を参照表示されませんでしたので、私はチャイムと思った - それが役に立てば幸い。
!私はあなたが欲しいものについてより明確にする必要があると思います。あなたがメインと拡張の両方の複数のインスタンスを持っていたことを想像してみてください。あなたがそれらのいずれかにデータを変更した場合、それらはすべての影響を受けているように、それらはすべて、同じデータを参照する必要がありますか?
もしそうであれば、一つのアプローチではなく、個々のインスタンスよりも、クラスに関連付けられている静的変数を使用することです。もう一つは、あなたのデータを格納する(別のクラスの)別のオブジェクトを作成し、それらが作成されているときに、メインと拡張クラスにそれを渡すことです。彼らは、それぞれ例えば、それへの参照を格納できます。
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);
でない場合は、データのコピーではなく、同じデータへの参照をしたいです。その場合は、2番目の例では、私はちょうど盲目的にすべてのメンバーをコピーしないだろうが、近います。
oooooooooooooooooooooooooooooooooooooooooooooooooooooh
あなたはこれをしたいです
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);
:)
EDITます:
また、あなたがこれを行うことができます:
class Templator
{
private $m_config = null;
function __construct($config)
{
$this->m_config = $config;
}
function PrintTemplate($name)
{
echo file_get_contents($this->m_config->template_path . $name);
}
}
$config->template_path = "./templates/";
$temp = new Templator($config);
$temp->PrintTemplate("index.html");