Introducing
Your new presentation assistant.
Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.
Trending searches
id:Fivestar / twitter:fivestr
もしLinuxのファイルシステムに
ディレクトリがなかったら?
それって今のPHPと同じ?
名前空間は で宣言
名前空間の区切り文字は (バックスラッシュ)
先頭に \ をつけて指定すると、
グローバル空間からの絶対指定になる
定数や 演算子で
現在の名前空間の指定が行える
を使うことでクラスのインポートや
でクラス/名前空間にエイリアスを作成することができる
ただし次は失敗:
use foo\bar\MyObject;
$class = 'MyObject';
$obj = new $class();
# => Fatal error: Class 'MyObject' not found
名前空間とは、PHP 5.3.0 から実装された
クラス名や関数名の衝突を避けるための仕組み
<?php
namespace foo;
class MyObject {}
namespace bar;
class MyObject {}
複数指定するならブレスを使う方が推奨される:
<?php
namespace foo {
class MyObject {}
}
namespace bar {
class MyObject {}
}
名前空間とグローバル空間を同時に指定する:
<?php
namespace foo {
class MyObject() {}
}
// グローバル空間
namespace {
$obj = new foo\MyObject();
}
ただ、複数の名前空間をひとつのファイルに記述するようなコーディングはできるだけ避けるべきです。 主な使い道としては、複数の PHP スクリプトをひとつのファイルにまとめるときくらいでしょう。
同じ名前空間を複数回指定可能:
<?php
use foo\Foo;
// foo\Foo
$obj = new Foo();
use MyApplication_MyObject as MyObj;
// MyApplication_MyObject
$obj = new MyObj();
use bar\baz as baz;
// bar\baz\Baz
$obj = new baz\Baz();
// baz\Baz
$obj = new \baz\Baz();
とのことです
<?php
namespace {
class MyObject {}
}
namespace foo {
class MyObject {}
}
namespace {
new MyObject();
}
namespace foo {
new MyObject();
}
ネストはできない:
<?php
namespace foo {
namespace bar {
class MyObject {}
}
}
# => Fatal error: Namespace
declarations cannot be nested
<?php
namespace foo;
#$array = new ArrayObject();
# => Fatal error: Class 'foo\ArrayObject' not found
$array = new \ArrayObject(array(0, 'a', 'b', 'c', 'b'));
$unique = array_unique((array)$array, SORT_STRING);
// 次と同等: \array_unique((array)$array, \SORT_STRING)
名前空間が適応されるのは:
グローバル空間 = ルートディレクトリ
現在の名前空間 = カレントディレクトリ
に置き換えると理解しやすいです
namespace usr\local;
$obj = new bin\Command();
上記の場合はカレントディレクトリからの
相対指定と同じなので、
usr\local\bin\Command クラスが
生成されます
(ただし、../ のような表現は使えません)
<?php
namespace foo\bar;
class MyObject {} // foo\bar\MyObject
function myfunc() {} // foo\bar\myfunc()
const MY_CONST = 1; // foo\bar\MY_CONST
// foo\bar\MyObject の作成
$obj = new MyObject();
// framework\Controller の作成
$controller = new \framework\Controller();
// foo\bar\myfunc() の呼び出し
namespace\myfunc();
// foo\bar\MY_CONST の出力
echo constant(__NAMESPACE__.'\MY_CONST');
インポート/エイリアスの注意点:
use \foo\Foo;
// 既にFooがimportされているので定義できない
class Foo {}
class Bar {}
// 同名のオブジェクトがすでに宣言されているので
// インポートできない
use bar\Bar;
hoge.txtを追加しよう!
/
|- hoge.txt
|- bin_ls
|- usr_bin_php
|- usr_bin_mysql
|- usr_local_bin_sl
|- usr_local_bin_php-5.3.1
|- home_fivestar_bin_php-5.3.1
|- var_www_index.php
|- var_www_css_style.css
|- var_www_scripts_phpinfo.php
...
名前空間区切り文字を含まない識別子
Foo, Bar
名前空間区切り文字を含む識別子
ダウンロードしたzipを展開したら
my_hoge.txtが上書きされた...
(´・ω:;.:...
foo\Bar, hoge\fuga\Piyo
名前空間区切り文字を含む識別子のうち、先頭が名前空間セパレータ、
もしくは namespace 演算子で始まるもの
名前がかぶるから
my_hoge.txt
とかにしておくか...
\foo\bar\Baz, namespace\Hoge
文字列で指定した場合は必ずグローバル空間から探される
namespace foo\bar;
$class = 'MyObject';
$obj = new $class();
# => Fatal error: Class 'MyObject' not found
名前解決はコンパイル時に行われるため、
実行時には名前解決は行われない
.....たぶん
<?php
namepace foo\bar {
class MyObject {}
}
namespace {
$class = 'foo\bar\MyObject';
$object = new $class;
}
フレームワークの中に
Fileクラスがあった...
\(^o^)/
File っていうモデル
クラスを作りました
use foo\bar as fb;
$class = 'fb\MyObject';
$obj = new $class();
# => Fatal error: Class 'fb\MyObject' not found
フレームワークを
使って開発しよう!
ファイルシステムには
ディレクトリがあるから、
ディレクトリさえ分けてしまえば
名前は被らないのに...
.__
ヽ|・∀・|ノ
|__|
| |
presented by
2009.12.15 モダンPHP勉強会
fivestar
symfonyのアドベントカレンダーの翻訳しました
ぜひ見てくださいね!
class_exists()
namespace foo {
class_exists('bar\MyObject');
# => 'bar\MyObject'
}
namespace {
use foo\bar\MyObject;
class_exists('MyObject');
# => 'MyObject'
}
<vendor>\(<package_or_component>\)*<ClassName>
useをしただけではクラスはロードされない
フレームワークやライブラリの開発者やコミュニティのメンバーらがPHPのコーディング規約について議論している
use foo\bar\MyObject;
new MyObject();
# => 'foo\bar\MyObject'
$classLoader = new SplClassLoader('Doctrine\Common', '/path/to/doctrine');
$classLoader->register();
$parser = new Doctrine\Common\Annotations\Parser();
# /path/to/doctrine/Doctrine/Common/Annotations/Parser.php
Jonathanがつくったオートローダー
SplClassLoader
主なメンバー:
2009.12.15 現在: 22名
<?php
spl_autoload_register(function ($className)
{
echo $className;
}
)
不明
準拠する?
namespace {
new foo\bar\MyObject();
# => 'foo\bar\MyObject'
}
namespace foo {
new bar\MyObject();
# => 'foo\bar\MyObject'
new \MyObject();
# => 'MyObject'
}
PEAR2は pear2\HTTP\Request のようになるかも?
命名規則は準拠
Cakeは一切調べていません
名前空間もアッパーキャメル
現状のPEARの命名規則における _ を \ に置き換えたものと同じ