思い出すシリーズ:
非推奨になった PHP の構文
株式会社あつまる ミツイ
はじめまして、PHP 5.3 を書いているミツイです
はじめに: 絶対に勘違いしてほしくないこと
PHP 8 リリースおめでとうございます!
200%成長
match 式 いいなー
$num = "0";
echo match($num, array(
array(0, "is zero\n"),
array("0", false, "is not zero\n"),
), "who?");
function match($x, $cond, $default)
{
foreach ($cond as $rules) {
$return = array_pop($rules);
foreach ($rules as $rule) {
if ($x === $rule) { return $return; }
}
}
return $default;
}
5分で書いたオレオレ match 式関数
名前付き引数 いいなー
public function __get($name)
{
return $this->__call($name);
}
public function __call($name, array $arguments = array())
{
try {
if (method_exists($this, "_{$name}")) {
$coimpleted_args = $this->__args_completion($name, $arguments);
return call_user_func_array(
array($this, "_{$name}"),
$coimpleted_args
);
} else if (
function_exists("get_field")
&& in_array($name, $this->advanced_custom_keys, /* $strict = */ true)
) {
// $name が Advanced Custom Fields プラグインで定義されたカスタムフィールドの場合
$advanced_custom_field = Acf::create($this->post_id, $name, $this->param);
return call_user_func_array(
array($advanced_custom_field, "get_value"),
$arguments
);
} else if (in_array($name, $this->custom_keys, /* $strict = */ true)) {
// $name が add_post_meta() で定義されたカスタムフィールドの場合
$post_meta = PostMeta::create($this->post_id, $name, $this->param);
return call_user_func_array(
array($post_meta, "get_value"),
$arguments
);
} else {
throw new NotSupportKeyException($name);
}
}
// NotSupportKeyException|UnknownCustomKeyException $e と書きたいところだけど
// PHP 7.0 以前には対応していないので下記のような冗長な書き方で我慢する
catch (NotSupportKeyException $e) {
if ($this->__faithful) {
throw $e;
} else {
// 取得を試みた値 $name がその投稿でサポートされていないものだったら
// $name に応じたデフォルト値を返す
// デフォルト値はほとんどの場合 空文字列 "" だが、
// 取得を試みた $name によっては $e->get_default() が
// array() や false だったりするだろう
return $e->get_default();
}
}
catch (UnknownCustomKeyException $e) {
if ($this->__faithful) {
throw $e;
} else {
// 取得を試みた値 $name がその投稿でサポートされていないものだったら
// $name に応じたデフォルト値を返す
// デフォルト値はほとんどの場合 空文字列 "" だが、
// 取得を試みた $name によっては $e->get_default() が
// array() や false だったりするだろう
return $e->get_default();
}
}
// Exception|Error $e と書きたいところだけど
// PHP 7.0 以前には対応していないので下記のような冗長な書き方で我慢する
catch (Exception $e) {
if ($this->__faithful) {
throw $e;
} else {
return "";
}
}
catch (Error $e) {
if ($this->__faithful) {
throw $e;
} else {
return "";
}
}
}
public function __isset($name)
{
return $this->offsetExists($name);
}
private function __args_completion($name, array $args)
{
$method_name = "_{$name}";
if (!method_exists($this, $method_name)) { return array(); }
$method_ref = new ReflectionMethod($this, $method_name);
$param_refs = $method_ref->getParameters();
$param_names = array();
$default_args = array();
foreach ($param_refs as $param_ref) {
$param_name = $param_ref->getName();
$param_name = str_replace("NAME", $name, $param_name); // 仮引数名に 'NAME' が含まれる場合、それを $name で置換したものを真の仮引数名とみなす
$param_names[] = $param_name;
$default_args[$param_name] = $param_ref->getDefaultValue();
}
$packed_args = $this->__pack_arguments($param_names, $args);
$merged_param = array_merge($default_args, $this->param, $packed_args);
$completed_args = array();
foreach ($param_names as $param_name) {
if (array_key_exists($param_name, $merged_param)) {
$completed_args[] = $merged_param[$param_name];
} else {
throw new RuntimeException("不明な param_name です: name: {$name}, param_name: {$param_name}");
}
}
return $completed_args;
}
private function __pack_arguments(array $param_names, array $arguments)
{
if (count($arguments) == 0) { return array(); }
if (count($arguments) == 1 && is_array($arguments[0])) {
return $arguments[0];
}
$param_name_and_argument_pairs = array_map(null, $param_names, $arguments);
$packed_args = array();
for ($i = 0, $len = count($arguments); $i < $len; $i++) {
list($param_name, $value) = $param_name_and_argument_pairs[$i];
if (!is_null($param_name)) { $packed_args[$param_name] = $value; }
}
return $packed_args;
}
5時間くらいかけて書いた
オレオレ名前付き引数マジックメソッド
名前付き引数 いいなー
class Foo extends Base
{
function _some_method(
$hoge = "Hoge",
$fuga = "Fuga"
)
{ /* ... */ }
}
// みたいに定義すると
$foo = new Foo;
$foo->some_method(array( "fuga" => "fff" ));
// みたいに呼び出せる
途中に: 絶対に勘違いしてほしくないこと
アジェンダ
1. クラス名と同名のコンストラクタ
class Foo
{
function __construct()
{
if (method_exists($this, "Foo")) { $this->Foo(); }
}
function Foo()
{
echo "foo";
}
}
2. create_function()
$sum = create_function('$x,$y', 'return $x + $y;');
echo $sum(2, 3); // => 5
3. while (list($v, $k) = each($arr)) { ... }
while (list($v, $k) = each($arr)) { ... }
// ↓↓↓
foreach ($arr as $k => $v) { ... }
4. <script language="php">
<h1>
<script language="php">
echo "Hello,world!\n";
</script>
</h1>
むしろ PHP 4 の世界を体験したいと思った人へ
むしろ PHP 4 の世界を体験したいと思った人へ
XAMPP v0.9 !!!
2003-07-27 リリース!!!!!
これをインストールすると、
PHP 4.3.3 が入るよ!
XAMPP Download�https://www.apachefriends.org/download.html
おわりに: 絶対に勘違いしてほしくないこと