Подтвердить что ты не робот

Частный статический метод против статического метода

Я понимаю, что static означает, что объект не должен быть создан для того, чтобы это свойство/метод было доступно. Я также понимаю, как это относится к частной собственности и методам и общедоступным методам. Я пытаюсь понять, что статическая частная функция набирает вас. Например:

class Beer {
    static private $beertype = "IPA";

    private function getBeerType() {
            return self::$beertype;
    }

    static public function BeerInfo() {
            return self::getBeerType();
    }
}

print Beer::BeerInfo() . "\n";

Частный метод getBeerType() выполняется просто отлично без экземпляра объекта, если он вызывается из статического общедоступного метода. Если статический общедоступный метод имеет доступ ко всем приватным методам (статическим и нестационарным), то какой смысл объявлять метод static private?

При включенном строгом сообщении об ошибках я получаю предупреждение о том, что мне нужно сделать getBeerType() static, хотя он все еще позволяет мне запускать код. И я сделал небольшое исследование, и кажется, что другие языки (Java) заставят вас объявить частный метод статичным при вызове статическим общедоступным методом. Похоже, PHP позволяет вам уйти от этого. Есть ли способ заставить его выбросить ошибку и не выполнить?

4b9b3361

Ответ 1

Статический частный метод обеспечивает способ скрыть статический код вне класса. Это может быть полезно, если необходимо использовать несколько разных методов (статических или нет), то есть повторное использование кода.

Статические методы и статические переменные, иногда называемые методами класса и переменными класса, являются способом помещения кода и данных в своеобразное пространство имен. Вы также можете думать о переменных класса как переменных, связанных с самим классом, из которых (по определению) есть только один, а не экземпляры этого класса, из которых может быть ноль, один или многие. Методы класса и переменные класса могут быть полезны при работе с атрибутами, которые не только остаются такими же во всех случаях, но на самом деле одинаковы.

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

Частное против общественности - это совершенно отдельное качество, и я подозреваю, что вы спотыкаетесь. Частный метод не может быть вызван, а частные переменные недоступны из кода вне класса. Частные методы обычно используются для реализации "внутренней" логики объекта, который не должен быть доступен извне объекта. Это ограничение может потребоваться методами экземпляра, а также методами класса.

Примером метода частного класса может быть метод factory. Может существовать три вызова factory для создания объекта, который может отличаться при подаваемых параметрах. Но основная часть операции такая же. Таким образом, он переходит в метод private static, который вызывает не private-методы factory.

Ответ 2

Я понимаю, что static означает, что объект не должен быть создан для того, чтобы это свойство/метод был доступен.

Все статическое просто существует. Во всем мире.

Я также понимаю, как это относится к общедоступным свойствам и методам и общедоступным методам.

Вы уверены, что поняли, что он создает глобальную переменную и стандартную глобальную функцию?

То, что я пытаюсь понять, - это то, что статическая частная функция набирает вас.

Частный - это просто спецификатор видимость Docs. Таким образом, вы получаете контроль над видимостью.

Это полезно? Зависит от прецедента.

Ответ 3

Несмотря на то, что код работает, он выдает строгую стандартную ошибку:

Строгие стандарты: нестатический метод Beer:: getBeerType() не должен быть называется статически

Итак, здесь вы используете private static.

Ответ 4

для предотвращения использования ДРУГИХ.

Например, у вас есть статический объект Logger, тогда у вас есть два общедоступных статических метода LogOk и LogError, и оба они получают выгоду от "внутреннего" метода Log, но вы не хотите, чтобы потребители этого класса, чтобы иметь возможность напрямую вызывать Log.

Вы можете вызвать Logger::LogOk( "All right." );, но вы не можете вызвать Logger::Log( "abc" );, если Log является закрытым.

Вы можете внутренне всегда использовать его из того же класса.

Ответ 5

Проще говоря, вы можете объявить private static function если у вас есть повторяющаяся операция в некоторых public static функциях в классе.

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

Вот хорошее прочтение: принцип единой ответственности и объект Бога

Ответ 6

Здесь правило и лучший ответ,

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

static public function BeerInfo() {
            return self::getBeerType()

неверно,

вам нужно объявить getBeerType как static.

Ответ 7

В вашем примере вы можете упростить это, выполнив следующие действия.

static private $beertype = "IPA";

static public function BeerInfo() {
   return self::$beertype;
}

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

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

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

static public function doSomething(Beer &$ref) {
   $ref->instanceLevelFunction(...);
}