Что самый эффективный путь состоит в том, чтобы получить значения свойств от родительского объекта?

У меня есть единственный родительский класс случая, который держит 'местные глобальные свойства', что у каждого дочернего класса должен быть доступ к (также, когда это изменяется),

Я могу думать о двух способах удостовериться, что ребенок от иллюстрировавшего примерами родителя наследует родительские ценности:

1) Используя статические переменные

class p
{
public static $var = 0;
}

class c extends p
{
function foo()
{
echo parent::$var;
}
}

$p = new p;
$c = new c;

$c->foo(); //echoes 0
p::$var = 2;
$c->foo(); //echoes 2

2) Используя переданный объект

    class p
    {
          public $var = 0;
    }

    class c extends p
    {
           function update_var(p $p)
      {
            $this->var = $p->var;
      }

    function foo()
    {
    echo $this->var;
    }
    }

    $p = new p;
    $c = new c;

    $c->foo(); //echoes 0
    $p->var = 2;
$c->update_var($p);
    $c->foo(); //echoes 2

По-моему, статическое решение - безусловно самое изящное, но могли бы быть некоторые недостатки, которые я не вижу. Какому решению вы верите, чтобы быть лучшими, или есть ли третий лучший вариант?

(Также отметьте в этом примере, который $var общественный, чтобы сделать этот пример легче иллюстрировать, но закончится защищенный),

0
nl ja de

2 ответы

Возможно, лучше иметь различный объект как хранение для тех переменных, которые могли быть введены к каждому объекту?

Идея с обновлением переменных, кажется, сумасшедшая.

Если бы вам нужно меньше кода, можно сделать это со статическим Варом, но я сделал бы некоторый контейнер конфигурации, который будет введен в каждом классе (прочитанный о внедрении зависимости: http://en.wikipedia.org/wiki/Dependency_injection)

class Config
{
    protected $vars;

    public function __get($name)
    {
        if (isset($this->vars[$name])) {
            return $this->$name;
        }
    }

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

    public function toArray()
    {
        return $this->vars;
    }
}

class Component 
{
    protected $config;

    public function __construct(Config $config = null)
    {
        $this->config = $config;
    }

    public function getConfig()
    {
        return $this->config;
    }
}

// Create config instance
$config = new Config();

// Store variable
$config->testVar = 'test value';

// Create component and inject config
$component = new Component($config);

// Save another one variable in config
$config->test2Var = 'test 2 value';

// Create one more component and inject config
$component2  = new Component($config);

// Create one more varible
$config->someMoreVar = 'another one variable';

// Check configs in different components, values will be same (because config object is not cloned, just link to this object is saved in Component's $config property):
var_dump($component->getConfig()->toArray());
var_dump($component2->getConfig()->toArray());

P.S. Я не проверил этот код, только чтобы показать идею

1
добавлено
В настоящее время в моих проектах я использую DI с __, добираются __ методы установки, таким образом, я могу получить доступ к конфигурации от любого объекта, используя $this-> требование конфигурации.
добавлено автор avasin, источник
Вы использовали бы это, чтобы сохранить все ценности конфигурации для всех родительских классов? Или сделайте класс конфигурации для каждого родительского класса? У меня есть несколько родительских классов, что у каждого есть многократный ' global' свойства перейти, и родительские классы shouldn' t действительно имеют доступ к другим свойствам конфигурации родительских классов.
добавлено автор LongInt, источник
Но мне действительно нравится идея наличия всех ценностей конфигурации в том же самом месте. Возможно, я мог сделать своего рода идентификацию, чтобы удостовериться, что у правильных классов только есть доступ к правильным свойствам...
добавлено автор LongInt, источник
Мой пункт, хотя, то, что я не мог бы хотеть объект иметь доступ ко всем свойствам конфигурации. Но спасибо за альтернативное решение, I' ll должен думать немного больше об этом, прежде, чем уладить его.
добавлено автор LongInt, источник

то, что у каждого дочернего класса должен быть доступ к (также, когда это изменяется)

Это означает, что вы хотите использовать статические переменные, так как это точно, для чего они были разработаны.

Другой выбор состоял бы в том, чтобы использовать константы, но если они подходят аккуратно к вашему классу, тот , статичный , способ пойти

Править: Или, вы могли использовать образец @true, предложил, если вам нужно что-то немного более сложное.

1
добавлено
Большое спасибо. Это было также решением, я надеялся, будет правильный:)
добавлено автор LongInt, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp