パーフェクトPHP 読書メモ 5章 クラスとオブジェクト

パーフェクトPHP (PERFECT SERIES 3)
小川 雄大
技術評論社
2010-11-12


p.127で、「定数に用いることができるのはスカラーの値のみです。式を用いたり、配列やリソースなどを定数に用いることはできません」と記載されているが、PHP5.6では定数定義に式を用いることができるようになっている(constant scalar expressions)。ここに限らず、古く感じられる説明が出てきている。そろそろ改訂版が欲しいところ。

標準クラスからオブジェクトを生成する

<?php
$obj = new stdClass(); // 空のオブジェクトを生成
$obj->member = 'hoge'; // PHPでは未定義メンバに値を入れてもエラーにはならない
$obj->method = function(){echo $this->member;}; // 未定義メソッドの定義はエラーが出ないが…
$obj->method(); // 実際に呼び出すとエラーが出る

遅延静的束縛(staticキーワードによる呼び出し)

<?php
class Foo
{
public function getClassNameGateway()
{
echo self::getClassName(); // 必ず Foo::getClassName() が呼ばれる
echo static::getClassName(); // 呼び出されたコンテキストに応じて解決される(Fooが呼べばFoo::getClassName()、Barが呼べばBar::getClassName()が呼ばれる)
echo PHP_EOL;
}
public static function getClassName()
{
return 'Foo';
}
}
class Bar extends Foo
{
public static function getClassName()
{
return 'Bar';
}
}
$foo = new Foo();
$foo->getClassNameGateway(); // FooFoo
$bar = new Bar();
$bar->getClassNameGateway(); // FooBar

オートローダの仕組み(__autoload()を使う場合)

<?php
$obj = new Foo(); // 未定義クラスを呼び出すと、__autoload()が自動的に呼び出される
function __autoload($name) {
echo $name, PHP_EOL; // ここで $name を元にPHPファイルを読みこめば、オートローダになる
}

ただし、__autoload()にはオートロード処理を1種類しか登録できないため、実際のオートローダはほとんどspl_autoload_register()で実装されている。

名前空間

<?php
namespace Acme; // 名前空間の宣言の前には、PHPタグとコメント以外の出力や文が存在してはいけない
class stdClass {}; // AcmestdClass
function file_get_contents(){}; // Acmefile_get_contents()
const E_ALL = 0x01; // AcmeE_ALL
$var = 0x01; // 変数に名前空間は適用されない

コメントを残す

コメントを残す