<?php

// Интрефейс чего-то, что можно включить и выключить
interface SwitchInterface {
    function turnOn();   // Включить
    function turnOff();  // Выключить
    function isOn();     // Возвращает true, если включено
    function isOff();    // Возвращает true, если выключено
    function state();    // Возвращает текущее состояние
}

// Какая-то стратегия, которая что-то делает
interface StrategyInterface {
    function apply();  // Что-то делаем
}

// Стратегия включения лампы
class TurnOnStrategy implements StrategyInterface {
    function apply($subject = null) {
        // Если есть, что включать
        if ($subject instanceof SwitchInterface) {
            // Если оно выключено
            if ($subject->isOff()) {
                // Включаем
                $subject->turnOn();
            } else {
                // Если оно уже включено, ничего не делаем
            }
        }
    }
}

// Какой-то прибор
abstract class DeviceAbstract implements SwitchInterface {
    const STATE_ON = 'on';    // Состояние "Включено"
    const STATE_OFF = 'off';  // Состояние "Выключено"

    private $state = self::STATE_OFF;  // Текущее состояние объекта (по умолчанию "Выключено")

    // Включить
    function turnOn() {
        $this->state = self::STATE_ON;
    }

    // Выключить
    function turnOff() {
        $this->state = self::STATE_OFF;
    }

    // Проверить, "включен" ли объект
    function isOn() {
        return $this->state === self::STATE_ON;
    }

    // Проверить, "выключен" ли объект
    function isOff() {
        return $this->state === self::STATE_OFF;
    }

    // Вернуть текущее состояние объекта
    function state() {
        return $this->state;
    }
}

// Лампа
class Lamp extends DeviceAbstract {
    // Никакой дополнительной логики пока нет
}

// Некто
class Person {
    // Применить стратегию к переключателю
    function applyStrategyToSwitch(StrategyInterface $strategy, SwitchInterface $device) {
        $strategy->apply($device);
    }
}

// Создаём объекты
$lamp = new Lamp();
$person = new Person();
$turnOn = new TurnOnStrategy();

// Несколько раз включаем лампу
$person->applyStrategyToSwitch($turnOn, $lamp);
$person->applyStrategyToSwitch($turnOn, $lamp);

// Выводим результат
print_r($lamp->state());  // Выведет "on"