Нет. Вы не можете включать файлы в тело класса.
В файл, определяющий класс, вы можете включать только файлы в теле метода или вне тела класса .
Из вашего описания я понимаю, что вы хотите:
<?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();
}
Теперь у вас есть контракт, которому должны подчиняться все мяуканье, а именно метод мяу. Далее определите поведение мяуканья:
<?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';
Хотя вы также могли бы решить вышесказанное с помощью наследования , определив abstract BaseCat и метод meow, а затем извлекая из этого конкретные классы RegularCat и Lolkat, вы должны учитывать, что вы хочу добиться. Если ваши кошки никогда не изменят то, как они мяукают, продолжайте и используйте наследование, но если ваши RegularCat и Lolkat должны выполнять произвольные мяу, то используйте шаблон Стратегии.
Чтобы узнать больше шаблонов проектирования в PHP, проверьте следующие ресурсы: