Я могу включать код в класс PHP?

Я хочу сделать класс PHP, позволяет, говорят Myclass.php. Теперь в том классе я хочу определить просто сам класс и некоторые переменные экземпляра. Но все методы должны появиться из файла Myclass_methods.php. Я могу просто включать тот файл в тело класса?

У меня есть серьезные основания, почему я хочу разделить это. Короче говоря, у меня будет бэкенд, в котором я могу изменить бизнес-логику класса, в то время как все другие вещи должны остаться нетронутыми. Система поддерживает весь ORM и другой материал для меня.

Но если это - плохая идея, могло бы быть лучше повторно создать целый файл класса после редактирования бизнес-логики (так, пользовательские методы в этом случае).

Вопрос о производительности: Если во время одного запроса Myclass.php включен только однажды, на самом деле это, Myclass_methods.php должен также быть включен только однажды. Могло бы быть неправильным. Эксперты?

55
задан Gordon 4 March 2013 в 07:13
поделиться

2 ответа

Нет. Вы не можете включать файлы в тело класса.
В файл, определяющий класс, вы можете включать файлы только в тело метода или вне тела класса .

Судя по вашему описанию, вы хотите следующее:

<?php // MyClass.php
class MyClass
{
    protected $_prop;
    include 'myclass-methods.php';
}

<?php // myclass-methods.php
public function myMethod()
{
   $this->$_prop = 1;
}

Выполнение этого кода приведет к

Parse error: syntax error, unexpected T_INCLUDE, expecting T_FUNCTION

Что возможно, хотя это

<?php // MyClass.php
class MyClass
{
    protected $_prop;
    public function __construct() // or any other method
    {
        include 'some-functions.php';
        foo($b); // echoes 'a';
    }
}

<?php // some-functions.php
$b = 'a';
function foo($str)
{
   echo $str;
}

Выполнение этого способа приведет к импорту содержимого включаемого файла в область действия метода , а не область действия класса. В включаемый файл можно включать функции и переменные, но не методы. Вы могли, но не должны помещать в него целые скрипты и изменять то, что делает метод, например

<?php // MyClass.php
    // ...
    public function __construct($someCondition)
    {
        // No No Code here
        include ($someCondition === 'whatever') ? 'whatever.php' : 'default.php';
    }
    // ...

<?php // whatever.php
    echo 'whatever';

<?php // default.php
    echo 'foo';

Однако исправление класса таким образом, чтобы показать другое поведение, - это не то, как вы должны делать это в ООП. Это просто неправильно и должно вызвать кровотечение из глаз.

Поскольку вы хотите динамически изменять поведение, расширение класса также не является хорошим вариантом (см. Ниже, почему). Что вам действительно нужно сделать, так это написать интерфейс и заставить ваш класс использовать объекты, реализующие этот интерфейс, таким образом, убедившись, что соответствующие методы доступны. Это называется паттерном стратегии и работает следующим образом:

<?php // Meowing.php 
interface Meowing
{
    public function meow();
}

Теперь у вас есть контракт, которому должны подчиняться все режимы мяуканья, а именно наличие метода мяуканья. Затем определите Meowing Behavior:

<?php // RegularMeow.php
class RegularMeow implements Meowing
{
    public function meow()
    {
        return 'meow';
    }
}

Теперь, чтобы использовать его, используйте:

<?php // Cat.php
class Cat
{
    protected $_meowing;

    public function setMeowing(Meowing $meowing)
    {
        $this->_meowing = $meowing;
    }

    public function meow()
    {
        $this->_meowing->meow()
    }
}

Добавив Meowing TypeHint в setMeowing, вы убедитесь, что переданный параметр реализует интерфейс Meowing. Давайте определим другое поведение мяуканья:

<?php // LolkatMeow.php
class LolkatMeow implements Meowing
{
    public function meow()
    {
        return 'lolz xD';
    }
}

Теперь вы можете легко поменять местами поведение следующим образом:

<?php
require_once 'Meowing.php';
require_once 'RegularMeow.php';
require_once 'LolkatMeow.php';
require_once 'Cat.php';

$cat = new Cat;
$cat->setMeowing(new RegularMeow);
echo $cat->meow; // outputs 'meow';
// now to change the behavior
$cat->setMeowing(new LolkatMeow);
echo $cat->meow; // outputs 'lolz xD';

Хотя вы также могли бы решить описанное выше с наследованием , определив абстрактный BaseCat и meow, а затем извлекая из него конкретные классы RegularCat и Lolkat, вы должны решить, чего вы хотите достичь. Если ваши кошки никогда не изменят свое мяуканье, продолжайте и используйте наследование, но если предполагается, что ваши RegularCat и Lolkat могут издавать произвольные мяуканья, тогда используйте шаблон Стратегия.

Чтобы узнать больше о шаблонах проектирования в PHP, посетите следующие ресурсы:

167
ответ дан 26 November 2019 в 17:37
поделиться

Может быть, не стоит создавать класс ядра с соответствующей базовой функциональностью, а затем расширять его требуемыми методами - это кажется более логичным подходом.

.
8
ответ дан 26 November 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: