6

メインと拡張の2つのクラスがあります。拡張クラスでメイン変数を使用する必要があります。

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

より透明で効率的なソリューションが必要です:)

4

5 に答える 5

6

単純なコンストラクターで簡単に可能です

<?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

?>
于 2011-03-02T12:46:41.333 に答える
4

編集:これは、制御の反転(IoC)と依存性注入(DI)を使用するとはるかにうまく解決できます。独自のフレームワークまたは依存性注入コンテナのないフレームワークを使用する場合は、League/Containerを試してください

愚かな答えの歴史として左下の答え。


私が理解する正しい方法。

<?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";
于 2008-12-25T21:46:57.513 に答える
2

これは超古いことだと思いますが、他の誰かが手がかりを必要とする場合に備えて...

静的変数の使用を検討しましたか?

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();
?>

このコードを実行すると (PHP 5.3 で - 他のバージョンでも同じだと思います)、次の結果が得られます。

テストは:

OPで収集できるものから、拡張クラスであっても、親クラス変数が残る方法を探しています。これはその問題を解決します。

クラス スコープの外 (つまり、通常は$obj->varsを記述する場所) で変数をパブリックに呼び出すには、参照する親クラスに関数を作成して、self::$variable_nameその変数をコードにスローできるようにする必要があります。そのクラス、またはそれを拡張する他のクラスのいずれかを利用します。

たとえば、次のようなものです。

public function get_variable() {
    return self::$variable;
}

また、インスタンスに求めるもの (つまり、メソッドまたは変数) に基づいて、self::$variable を動的にスローする魔法のメソッドを作成することもできます。どのような場合でも、コードを配線して、同等の self::$variable をスローすることができます。

この種のことを可能にするさまざまなマジック メソッドの詳細については、http://php.net/manual/en/language.oop5.magic.phpを参照してください。

OPは少し不可解だったので、それがまさにあなたが望んでいたものかどうかはわかりませんでしたが、ここで静的変数を参照している人は他に誰もいなかったので、私がチャイムを鳴らすと思いました-それが役立つことを願っています!

于 2010-03-06T11:58:27.057 に答える
1

自分が何を望んでいるのかをもっと明確にする必要があると思います。Main と Extended の両方のインスタンスがいくつかあるとします。それらのいずれかのデータを変更すると、それらすべてが影響を受けるように、それらはすべて同じデータを参照する必要がありますか?

その場合、1 つのアプローチは、個々のインスタンスではなくクラスに関連付けられている静的変数を使用することです。もう 1 つは、(別のクラスの) 別のオブジェクトを作成してデータを格納し、作成時にそれを 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);

そうでない場合は、同じデータへの参照ではなく、データのコピーが必要です。その場合、すべてのメンバーをやみくもにコピーするわけではありませんが、2 番目の例がより近くなります。

于 2008-12-25T23:14:20.783 に答える
0

うおおおおおおおおおおおおおおおおおお

あなたはこれを求めている:

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

:)

編集:

また、これを行うことができます:

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");
于 2008-12-25T23:41:07.860 に答える