Влияет ли порядок открытых функций PHP в классе на его выполнение? - PullRequest
3 голосов
/ 10 августа 2010

Я следовал этому Symfony учебнику.В некоторых разделах он просто говорит мне добавить public function внутри class, но не говорит, нужно ли мне добавлять его в начале или в конце класса.

Например:

/**
 * JobeetCategory
 *
 * This class has been auto-generated by the Doctrine ORM Framework
 *
 * @package    jobeet
 * @subpackage model
 * @author     Your name here
 * @version    SVN: $Id: Builder.php 7490 2010-03-29 19:53:27Z jwage $
 */
class JobeetCategory extends BaseJobeetCategory
{
  public function countActiveJobs()
  {
    $q = Doctrine_Query::create()
      ->from('JobeetJob j')
      ->where('j.category_id = ?', $this->getId());

    return Doctrine_Core::getTable('JobeetJob')->countActiveJobs($q);
  }

  public function getSlug()
  {
    return Jobeet::slugify($this->getName());
  }

  public function getActiveJobs($max = 10)
  {
    $q = Doctrine_Query::create()
      ->from('JobeetJob j')
      ->where('j.category_id = ?', $this->getId())
      ->limit($max);

    return Doctrine_Core::getTable('JobeetJob')->getActiveJobs($q);
  }
}

Открытая функция getActiveJObs была первой, показанной в учебнике, а countActiveJobs - последняя добавленная мной функция в соответствии с учебником.

Имеет ли порядок открытых функций внутриклассный вопрос?

Ответы [ 3 ]

18 голосов
/ 10 августа 2010

Имеет ли значение порядок открытых функций внутри класса?

Нет, это не так. Класс оценивается в целом; порядок методов не имеет значения.

Так что, хотя это никоим образом не является обязательным, самый распространенный порядок, с которым я столкнулся, и мой любимый способ заказа -

class ClassName 
 {

  - Variable definitions

  - Class constants

  - Constructor 

  - Public methods

  - Destructor (if needed)

  - Magic functions (if needed)

  - Private / helper methods

  }
1 голос
/ 05 апреля 2011

На этот вопрос много ответов и много личных предпочтений :-) С технической точки зрения это может не иметь значения, но, тем не менее, имеет значение.

Вот одно предложение для структуры.Представьте, что вы впервые посещаете занятия.Возможно, вы вызываете его публичные методы для выполнения какой-то задачи, и теперь вы хотите больше узнать об этом.Кажется довольно естественным начать с открытых переменных и функций сверху.Думайте об этом с точки зрения абстракции.Более высокие уровни абстракции высоко в классе.Чем ниже вы спускаетесь, тем ниже уровень абстракции.Таким образом, из общедоступных функций вверху вы получите кучу приватных функций снизу.Это сделает для лучшей читаемости.

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

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

Тогда мы должны получить что-то вроде этого:

class MyClass
{
    const MY_CONSTANT_ONE
    const MY_CONSTANT_TWO

    public $myPublicVariableONe
    public $myPublicVariableTwo
    protected $_myProtectedVariableOne
    private $_myPrivateVariableOne
    private $_myPrivateVariableTwo

    public function DoSomeOfficialStuff()
    {
        $this->_myNicePrivateMethodOne();
    }

    private myNicePrivateMethodOne(){
    }

    public function returnSomeOfficialStuff()
    {
        $this->_myNicePrivateMethodTwo();
    }

    myNicePrivateMethodTwo(){
    }
}
0 голосов
/ 10 августа 2010

Ответов нет.Функции будут вызываться где-то еще и не будут выполняться сверху вниз.Не имеет значения, находится ли countActiveJobs в начале класса или внизу.

...