Частная статическая функция PHP

Я младший программист PHP. У меня еще есть чему поучиться. Вот почему я задаю этот вопрос. В классе у вас есть открытая функция, которую вы можете вызывать из-за пределов этого класса. Иногда у вас есть закрытая функция, которую вы можете вызывать несколько раз в том классе, где находится закрытая функция, для многократного использования. Мне нравится устанавливать приватную функцию на статическую, и я вызываю эту функцию с помощью:

self::privateFunctionName();

Используя сам это напоминает мне, что эта частная функция находится в этом классе. если я использую $ This-> privateFunctionName () для нестатической функции это может быть в суперклассе / базовом классе или в самом подклассе. Вот почему я люблю использовать статическую приватную функцию. С профессиональной точки зрения, является ли хорошей идеей использовать статическую частную функцию вместо нестатической? Есть ли какой-то недостаток, что такой профессиональный программист, как вы, предпочитает избегать статической функции?

1

Решение

Только используя self::... не должно означать, что метод является статическим. parent:: а также self:: работать также для нестатических методов. Вы можете найти это в Руководство по PHP — Оператор разрешения области (: 🙂 и я добавляю примерный отрывок кода в конце ответа.

Возможно, вы захотите прочитать все ответы на этот предыдущий вопрос:

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

Вы могли быть смущены оператором :: который используется теми. У меня была похожая проблема с пониманием.

Тем не менее, не просто решили использовать статические методы по такой ограниченной причине. Эти статические методы класса должны использоваться только в очень ограниченных и узких ситуациях. Как правило большого пальца:

«Не используйте статические методы класса.»

Если вы хотите начать с объектно-ориентированного программирования, просто используйте обычные объектные методы.

Вот выдержка из существующего кода это показывает, что self:: так же как parent:: используются со стандартными (нестатическими) методами:

<?php

...

/**
* Class XMLElementIterator
*
* Iterate over XMLReader element nodes
*/
class XMLElementIterator extends XMLReaderIterator
{
private $index;
private $name;
private $didRewind;

/**
* @param XMLReader   $reader
* @param null|string $name element name, leave empty or use '*' for all elements
*/
public function __construct(XMLReader $reader, $name = null)
{
parent::__construct($reader);
$this->setName($name);
}

/**
* @return void
*/
public function rewind()
{
parent::rewind();
$this->ensureCurrentElementState();
$this->didRewind = true;
$this->index     = 0;
}

/**
* @return XMLReaderNode|null
*/
public function current()
{
$this->didRewind || self::rewind();

$this->ensureCurrentElementState();

return self::valid() ? new XMLReaderNode($this->reader) : null;
}

...
3

Другие решения

self:: на самом деле это не означает, что метод является частью того же класса, он также мог быть унаследован от родительского класса!

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

Вы должны рассматривать методы как маленькие, автономные черные ящики. Вам не нужно знать и не хотите знать, что они делают. Все, что вы знаете, это когда вы вызываете метод foo с параметром $bar, Икс произойдет или вернется Y. Тебе все равно как это происходит, просто так оно и есть, потому что это то, что должен делать метод.

В качестве таких, static и нестатические методы передают другое использование с различными ограничениями. static методы должны вызываться, когда у вас нет объекта, например, как альтернативные методы конструктора (например, DateTime::createFromFormat).

Кроме того, ограничение метода static означает, что он не имеет доступа к данным экземпляра объекта, что может ограничить вас в будущем. По мере развития вашего проекта вы можете обнаружить, что вашему методу теперь нужно учитывать некоторые дополнительные данные объекта, чтобы выполнять свою работу. Если вы объявили его как нестатический с самого начала, все, что нужно, это небольшая модификация самого метода; для внешнего мира он все еще выполняет свою работу таким же образом (вход → выход). Однако, если вы объявили это как static и вдруг возникает необходимость сделать его нестатичным, вы должны изменить намного больше кода, чем этот метод.

Итог: если ваш метод не должен быть публичным, потому что вызывать его, кроме вашего собственного класса, некому, сделайте его private, Если метод должен быть static потому что это должен работать без контекста объекта, сделать это static, Если он удовлетворяет обоим требованиям, сделайте это private static, В противном случае нет.

1

Ну, по сути, «частная статическая» функция — это конструкция, которая совершенно бессмысленна, потому что ее нельзя вызвать извне.

Нет реальной разницы между $ this-> и использованием self :: ожидайте, что он может быть вызван извне без объекта и столько же работы ЦП для вызова функции, независимо от того, в каком пространстве имен / класс эта функция находится.

Однако тот факт, что закрытая функция может быть вызвана только внутри одного и того же класса, у вас всегда есть объект, и модификатор «static» здесь несколько лишний, потому что он не имеет значения.

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

В некоторых случаях есть просто «другой» путь, а «профессиональный» вообще не существует.
Эта тенденция часто делает тот или иной метод популярным со временем.

0
По вопросам рекламы [email protected]