объявления функций php ООП - PullRequest
2 голосов
/ 30 мая 2010

Я большой поклонник ООП в php, но я чувствую, что определение методов класса дезорганизовано так быстро. У меня довольно хороший опыт работы с ООП в C ++, и я вполне доволен тем, как он там обрабатывается, и мне любопытно, есть ли способы сделать это аналогичным образом в php.

Чтобы быть более конкретным, вот что я имею в виду. Мне нравится, как в C ++ вы можете определить заголовок класса (myclass.h), а затем определить фактические детали функций в файле реализации (myclass.cc). Я обнаружил, что это может быть легко воспроизведено с использованием интерфейсов в php, но я не нашел хорошего решения для следующего:

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

Я пытался определить методы класса в php:

private function MyPHPClass::myFunction(){ }

когда определение не находится непосредственно внутри блока класса ({}), но у меня не было никакого успеха в этом.

Я просмотрел все страницы на php.net, но не смог найти ничего подобного. Я предполагаю, что нет никакой поддержки для чего-то подобного, но подумал, что все равно спрошу.

спасибо

Ответы [ 2 ]

2 голосов
/ 30 мая 2010

Вы не можете сделать это. Объявления классов похожи на Java.

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

EDI2: Как указал в комментарии РобертПитт, вы должны рассмотреть альтернативные стратегии, которые разделяют функциональность между несколькими классами. У него есть дополнительное преимущество, заключающееся в том, что он может сделать ваш код более изолированным. Если вам нужно, вы все равно можете объединить функциональность нескольких классов за фасадом.

РЕДАКТИРОВАТЬ: Используя магические методы, я имею в виду что-то вроде этого:

class MyClassHelper {

    public function method_one(array $args) {
        ...
    }

    public function method_two(array $args) {
        ...
    }
}

class MyClass {
    /**
     * @var MyClassHelper
     */
    private $helper;

    private static $ALLOWED_METHODS = array("method_one" => NULL,
        "method_two" => NULL);

    public function __call($name, $arguments) {
        $name = strtolower($name);
        if (array_key_exists($name, self::$ALLOWED_METHODS) {
            $helper->$name($arguments);
        }
        else
            throw new Exception(...);
    }
}

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

1 голос
/ 30 мая 2010

Я на самом деле не программист C ++ / C #, но интерфейсы в php я могу дать вам экзамен, чтобы посмотреть, поможет ли это.

Интерфейс

interface IDatabase
{
   public function connect($dns = '');
   public function disconnect($flushCache = false); //Do not use braces, Code free in interfaces
}

База данных абстрактного базового класса

abstract class Database
{
   //Some driver logic here to laod mysql,oracle etc
}

MySql Driver

class DBDriver_MySQl extends Database implements IDatabase
{
   public function connect($dns = '')
   {
     //Connection logic.
   }
   public function disconnect($flushDns)
   {
     //Disconnect Login
   }
}

Надеюсь, это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...