PHP bir genişletilmiş sınıfta ana değişkenlerini kullanma

5 Cevap php

Ben 2 sınıfları, ana ve ek var. Ben genişletilmiş sınıfta ana değişkenler kullanmanız gerekir.

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

$main = new Main;

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

class Extended extends Main { }

$other = new Extended;

var_dump($other->vars);

?>

Kim bunu yapabilir miyim?

Örneğin hiçbir geçerli:

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

Ben bazı çözüm daha şeffaf ve verimli gerekir :)

5 Cevap

Yapılandırma sınıfı için EDIT ne istediğiniz bir tekil ya da bunu saklayabilirsiniz bir tek belirtilebilir.

Ben anlamaya doğru yolu.

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

Basit bir kurucu ile kolayca mümkün olacaktır

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

?>

Ben ne istediğiniz konusunda daha açık olması gerektiğini düşünüyorum. Eğer Ana ve Genişletilmiş hem de çeşitli örneklerini olduğunu düşünün. Eğer bunlardan herhangi birinde verileri değiştirmek, onlar etkilenen tüm konum böylece hepsi aynı verilere başvurmalıdır?

Eğer öyleyse, o zaman bir yaklaşım, daha çok bireysel örneği daha sınıfına bağlı bir statik değişkeni, kullanmaktır. Başka bir veri depolamak için (farklı sınıf) ayrı bir nesne oluşturmak ve yarattıkları olduğunuzda Ana ve Genişletilmiş sınıflar onu geçmektir. Her mesela, buna bir referans olarak saklamak olabilir:

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

Eğer değilse, o zaman veri kopyalarını, yerine aynı verilere başvurular istiyorum. Ben sadece körü körüne tüm üyelerini kopyalamak olmaz, ancak bu durumda, ikinci örnek, daha yakın.

Ben bu süper-eski farkında, ama durumda herkesten bir ipucu ihtiyacı ...

Eğer statik değişkenler kullanarak düşündünüz mü?

PHP OOP tasarım deseni statik bir parent sınıfında değişkenler de, child sınıfında aynı kalır ilan şekildedir.

Örneğin ...

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

Bu kodu çalıştırmadan size aşağıdaki sonucu verecektir (PHP 5.3-ben de, diğer sürümleri için aynı olduğundan emin değilim):

Test is: a

Hatta genişletilmiş sınıfları - Ben senin OP ne toplayabilir itibaren, parent class variables kalması için bir yol arıyoruz. Bu, sorunu çözer.

Sınıf kapsamı dışında kamuya değişkenleri aramak için (yani normalde yazardım burada $obj->vars), üst sınıftaki bir fonksiyonu oluşturmak gerekir ki referansları self::$variable_name, böylece geri o sınıfı, ya da genişleten herhangi başka bir sınıf ya da kullanan kod için bu değişkeni atabilir.

Örneğin, gibi bir şey:

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

Bir yöntem ya da bir değişken yani - Ayrıca dinamik için örneği ne sormak dayalı geri self :: $ değişken atmak olacak sihirli bir yöntemi oluşturabilirsiniz. Sen her durumda kendini :: $ değişken eşdeğer geri atmak kod tel olabilir.

http://php.net/manual/en/language.oop5.magic.php Eğer bu tarz şeyleri yapmak için izin çeşitli sihirli yöntemler hakkında daha fazla bilgi için okuyun.

Yardımcı olur umarım - OP yüzden ben bu tam istediğin buysa emin değildi, ama ben burada herkesten statik değişkenler yüzden uymak düşündüm başvuru görmedim biraz şifreli oldu!

oooooooooooooooooooooooooooooooooooooooooooooooooooooh

Bunu istiyorum:

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:

Ayrıca, bunu yapabilirsiniz:

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