Проверьте, запускается ли функция из статического контекста. - PullRequest
6 голосов
/ 30 апреля 2011

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

Пример кода:

class MyClass {
  private $db;

  function __constuct(){
    $this->db = new DBConnect();
  }

  public static function myFunction(){
    if(/* Is static */){
      $db = new DBConnect();
    } else {
      $db =& $this->db;
    }
    // Do processing with $db, etc.
  }
}

Ответы [ 5 ]

8 голосов
/ 30 апреля 2011

Когда метод объявлен как статический, магическая переменная $ не только недоступна (возвращает NULL), но и невозможно определить, была ли функция на самом деле вызвана из статического контекста.Обратный след подразумевает, что для статического метода вызов $ object-> method () внутренне преобразуется в className :: method () во время выполнения.

http://php.net/manual/en/language.oop5.static.php

3 голосов
/ 30 апреля 2011

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

public function myFunction(){
    if(!isset($this)) {

(его все равно можно вызывать как статическую функцию, даже если вы не объявили ее как таковую).

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

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

Если вы выполняете функции статически, нет $ this, так как нет объекта. В итоге вы также сделаете private $db статической переменной и будете использовать ее как self::$db.

Тем не менее, я бы порекомендовал сбросить этот шаблон и написать что-то вроде:

class Foobar
{

   protected $_connection = null;

   public function __construct( DBConnect $db )  
   {
      $this->_connection = $db;
   }

   public function some_function()
   {
      $db = $this->_connection;
      // Do processing with $db, etc.
   }

}

И вы используете этот класс так:

$db = new DBConnection(  /* your password , user , host , etc. */);

$stuff = new FooBar( $db );
$stuff->some_function();

$blah = new DifferentClass( $db );

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

0 голосов
/ 30 апреля 2011

Даже при вызове статического метода из экземпляра (не рекомендуется) у вас нет доступ к $this, так что ваш класс будет смертельным.

class sns {
   public static function moo() {
      var_dump($this->fng);
   }
   public function goo() {
      var_dump($this);
   }
}

sns::moo();
$_ = new sns;
$_->moo();
$_->goo();

Как показал другой постер из руководства по php.

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

0 голосов
/ 30 апреля 2011

Решение 1. Сделайте переменную $db частной и используйте ее через геттер.

Решение 2. Внедрить шаблон синглтона на стороне dbal.

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