когда я запускаю скрипт
<?php
interface IBrakeBehaviour {
public function brake();
}
class Brake implements IBrakeBehaviour {
public function brake() {
echo "Simple Brake applied.";
}
}
class BrakeWithABS implements IBrakeBehaviour {
public function brake() {
echo "Brake with ABS applied.";
}
}
class Car {
private $_brakeBehavior;
public function __construct(IBrakeBehaviour $brakeBehavior)
{
$this->_brakeBehavior = $brakeBehavior;
}
public function brake() {
$this->_brakeBehavior->brake();
}
}
$bmw = new Car(new Brake());
$audi = new Car(new BrakeWithABS());
это автоматически повторяет «Простой Тормоз применен». Но это сообщение должно появиться, когда я выполню
$bmw->brake(); or $audi->brake();
и не раньше.
Кто-нибудь знает, что я делаю не так? Спасибо заранее.
Герберт
В PHP вы можете использовать оба __construct
и, если хотите, назовите конструктор так же, как класс (не уверен на 100%, применимо ли это ко всем версиям).
Итак, проблема, которую вы испытываете, заключается в том, что ваш Brake
класс реализует конструктор вместо того метода, который, как вы думаете, он реализует (brake
).
Теперь можно подумать, что будет разница между Brake()
а также brake()
, но нет. В php имена методов / функций нечувствительны к регистру, поэтому они одинаковы …
Как обойти эту проблему?
Если вы реализуете конструктор как __construct
до реализация brake
функция, она должна работать, т.е.
class Brake {
public function __construct() {} // First
public function Brake() {} // Then this
}
Иначе вы можете получить Redefining already defined constructor
ошибка.
Других решений пока нет …