Классы PHP, используемые в классах?

#php #class

#php #класс

Вопрос:

Я понимаю, что $something->function(); это вызов функции внутри класса, но что это $something->somethingelse->function(); значит?

Комментарии:

1. Вы уверены, что это $something->$somethingelse->function(); и не $something->somethingelse->function(); или $something->somethingelse()->function(); ?

Ответ №1:

Я полагаю, вы имеете в виду $something->somethingelse->function() .

Это означает, что свойство $something named $somethingelse — это другой объект, у которого есть метод function() .

 $something = new Class1();
$something->somethingelse = new Class2();  // Class2 has the "function()" method


// Now I can call...
$something->somethingelse->function();
  

Комментарии:

1. О, так какова цель этого?

2. @user658911 Цель состоит в том, чтобы иметь функциональность этого объекта внутри этого класса. Это называется шаблоном внедрения зависимостей .

3. Итак, вы бы использовали это для использования объекта базы данных, такого как $addusers-> db = $db; где $ db — это класс.

4. @user да, например, точно.

Ответ №2:

вы можете сказать это так:

 class foo {
  public $bar;
}

class bar {
  public $baz;
}

class baz {
  function blip() { echo "Hello World"; }
}

$foo = new foo();
$foo->bar = new bar(); // setting bar to new object
$foo->bar->baz = new baz(); // setting baz to new object
$foo->bar->baz->blip(); // calling the blip function
  

Комментарии:

1. Я изменил его, так что он работает точно так же. Я не знал, что var устарел — спасибо

Ответ №3:

Класс экземпляра $something содержит переменную экземпляра с именем $somethingelse, которая также является объектом (экземпляром класса).

Это считается плохой практикой (см. Закон Деметры в Википедии).

Хорошее объяснение Закона Деметры включено c2.com о Питере Ван Ройене — это:

Вы можете играть сами с собой.

Вы можете играть со своими собственными игрушками (но вы не можете их разобрать),

Вы можете играть с игрушками, которые вам дали.

И вы можете играть с игрушками, которые вы сделали сами.

Это на простом английском:

Ваш метод может вызывать другие методы в своем классе напрямую

Ваш метод может вызывать методы для своих собственных полей напрямую (но не для полей полей)

Когда ваш метод принимает параметры, ваш метод может вызывать методы для этих параметров напрямую.

Когда ваш метод создает локальные объекты, этот метод может вызывать методы для локальных объектов.

НО

Не следует вызывать методы для глобального объекта

Не должно быть цепочки сообщений a.getB().getC().doSomething() в каком-либо классе, отличном от класса A.

Еще одно интересное чтение — Закон Деметры, пересмотренный для менее строгого подхода.

Комментарии:

1. Я не согласен с тем, что это плохая практика в целом. Такие шаблоны, как внедрение зависимостей , не могли бы работать без этого

2. однако внедрение зависимостей заключается в том, чтобы внедрить экземпляр $somethingelse в $something, без необходимости создавать его с помощью new внутри $something (что закрепило бы зависимость). Речь идет не о том, чтобы раскрывать эти зависимости, какими должны быть «частные части» класса. Вы можете заставить его записывать только с помощью setter.