подчеркивания в вызовах функций php - PullRequest
1 голос
/ 28 января 2010

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

class DatabaseConnection
{
  public static function get()
  {
    static $db = null;
    if ( $db == null )
      $db = new DatabaseConnection();
    return $db;
  }

  private $_handle = null;

  private function __construct()
  {
    $dsn = 'mysql://root:password@localhost/photos';
    $this->_handle =& DB::Connect( $dsn, array() );
  }

  public function handle()
  {
    return $this->_handle;
  }
}

print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );

в этом коде, что означает наличие подчеркивания в переменных?

Ответы [ 4 ]

5 голосов
/ 28 января 2010

Это то же самое для методов и свойств : соглашение одно и то же: наличие имени, начинающегося с одного подчеркивания, обычно означает, что их следует рассматривать как private / protected.

(Конечно, это не то же самое с методами, имена которых начинаются с двух подчеркиваний: это магические методы , и два подчеркивания не должны использоваться для вашего "нормального" метода имена)

1 голос
/ 28 января 2010

Соглашение обычно таково:

  • одно подчеркивание обычно используется для защищенных / приватных методов и переменных, чтобы они выделялись
  • два подчеркивания зарезервированы для «магических» методов, таких как __construct, __get, __set и т. Д., Которые имеют особое значение в языке, поэтому вы не должны использовать его, если не пишете известный магический метод.

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

0 голосов
/ 28 января 2010

Свойства (переменные) имеют видимость так же, как методы (функции).

0 голосов
/ 28 января 2010

Ааа __construct - это особый метод. Это способ PHP сказать, что это конструктор. Они украли это из Python, вероятно, там, где это магические методы.

Когда создается экземпляр класса, конструктор вызывается автоматически.

поэтому, если вы создадите объект myconnection = DatabaseConnection (), он автоматически вызовет:

$dsn = 'mysql://root:password@localhost/photos';
$this->_handle =& DB::Connect( $dsn, array() );

... код в конструкторе. Поэтому, когда вы позже вызовете get () (будьте осторожны, он статический), у него будет соединение.

Иногда я перемещаю этот код в другой метод, скажем, connect (), и вызываю его в конструкторе, чтобы я мог сделать это любым способом. Я думаю, что настоящая вещь, которая сбивает вас с толку - это «статический» метод get. Для этого не требуется вызывать полностью построенный объект.

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