Я хочу сделать класс PHP, позволяет, говорят Myclass.php. Теперь в том классе я хочу определить просто сам класс и некоторые переменные экземпляра. Но все методы должны появиться из файла Myclass_methods.php. Я могу просто включать тот файл в тело класса?
У меня есть серьезные основания, почему я хочу разделить это. Короче говоря, у меня будет бэкенд, в котором я могу изменить бизнес-логику класса, в то время как все другие вещи должны остаться нетронутыми. Система поддерживает весь ORM и другой материал для меня.
Но если это - плохая идея, могло бы быть лучше повторно создать целый файл класса после редактирования бизнес-логики (так, пользовательские методы в этом случае).
Вопрос о производительности: Если во время одного запроса Myclass.php включен только однажды, на самом деле это, Myclass_methods.php должен также быть включен только однажды. Могло бы быть неправильным. Эксперты?
Нет. Вы не можете включать файлы в тело класса.
В файл, определяющий класс, вы можете включать файлы только в тело метода или вне тела класса .
Судя по вашему описанию, вы хотите следующее:
<?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, посетите следующие ресурсы:
Может быть, не стоит создавать класс ядра с соответствующей базовой функциональностью, а затем расширять его требуемыми методами - это кажется более логичным подходом.
.