Как распространить класс на множество исходных файлов? - PullRequest
0 голосов
/ 06 июля 2010

В настоящее время я работаю над проектом PHP, который включает в себя широкое использование базы данных. Основы таковы: у меня есть класс PDOFactory, который следует шаблону Factory, и абстрактный класс SQL со статическими методами (просто контейнер для этих методов), который, в свою очередь, обращается к PDOFactory

Как я уже сказал, проект предполагает интенсивное использование базы данных, поэтому класс SQL будет содержать множество методов. Однако их можно легко сгруппировать, в зависимости от того, с чем они имеют дело (например, хранение сеанса, вход / выход пользователя из системы и т. Д.). Это сделало бы класс SQL намного проще в обслуживании и так далее. И тут возникает большой вопрос: могу ли я получить источник содержания класса , разбросанного по многим файлам? Может быть (по крайней мере) два возможных решения этой проблемы:

  • Множественное наследование, то есть наличие классов SQLSession, SQLUser, SQLblahblah и заставить класс SQL наследовать их всех.
  • C ++ - как директивы препроцессора *, т.е. #include SQLSession.php; или что-то в этом роде.

Я знаю, что в PHP нет множественного наследования, так что исключается вариант № 1. Возможен ли вариант № 2? Или кто-нибудь знает о лучших решениях этой проблемы?

* Или на самом деле директивы препроцессора, поскольку PHP является препроцессором. :)

EDIT:

Вот попытка ответить на этот вопрос, основываясь на предложении Калиума. Это беспорядок читать, но это работает. Тем не менее, я буду придерживаться метода Билла, так как он чище.

class SQL {

  private static $oInstance = false;
  public static function getInstance()
  {
    if( self::$oInstance == false )
    {
      self::$oInstance = new self();
    }
    return self::$oInstance;
  }

  public $SESSION;

  private function __construct()
  {
    $this->SESSION = new SESSION;
  }
}

// this would be in another file
class SESSION {
  public function printOne()
  {
    echo "One";
  }
}


SQL::getInstance()->SESSION->printOne(); // outputs "One"

?>

Ответы [ 4 ]

2 голосов
/ 06 июля 2010

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

1 голос
/ 06 июля 2010

Я думаю, вы должны использовать шаблон Builder для SQL вместо пестрого контейнера статических методов.

Нет, в PHP нет множественного наследования. Вместо этого используйте делегирование.

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

<?php

include("define-functions.php"); // OK

class Foo
{
  include("define-methods.php");  // ERROR

  function foo()
  {
    include("method-body.php"); // OK
  }
}

PHP Parse error:  syntax error, unexpected T_INCLUDE, expecting T_FUNCTION 
in foo.php on line 7

Ваш комментарий:

Поскольку вы стремитесь использовать только статические методы, зачем вообще беспокоиться о классе? Просто определите функции в глобальной области видимости. Тогда вы можете include() столько, сколько хотите:

<?php

include("SQLSession.php");
include("SQLUser.php");
include("SQLblahblah.php");

SQLSession.php:

<?php

function SQLSessionStart()
{
   ...
}

function SQLSessionEnd()
{
   ...
}

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

1 голос
/ 06 июля 2010
0 голосов
/ 07 июля 2010

для меня это звучит так, как будто вы пытаетесь создать монолитный кусок кода, который является полной противоположностью ОО-кода на основе классов - я бы рекомендовал следовать DAO blueprint ядра Java шаблонов, и реализовать его в PHP для того, что вы хотите сделать :), который должен охватывать все ваши вопросы

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