singletonメソッドがあるクラスはsingletonを呼びたいけどだめだった件

どっか配列にクラスメイト生成するインスタンス変数名を格納しておいて、それを使って一気にnewしたかった
んで、さらにsingletonメソッドが有る場合はそれを使ってインスタンスの生成をしたかった

やってみた

安直に想像して以下のようにやってみた

<?php
foreach($class_array as $class_name => $instance_name){
	if(method_exists($class_name, 'singleton')){
		// singletonメソッドが有る場合はsingletonメソッドを利用する
		$$instance_name = $class_name::singleton();
	}else{
		// singletonメソッドが無い場合はnewする
		$$instance_name = new $class_name();
	}
}

おこられたw

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /var/www/html/class_new.php on line 1000

ちょっと改変

PHPのマニュアルページの以下のところをみたらevalでやっていたので変更
PHP: スコープ定義演算子 (::) - Manual

<?php
foreach($class_array as $class_name => $instance_name){
	if(method_exists($class_name, 'singleton')){
		// singletonメソッドが有る場合はsingletonメソッドを利用する
		eval('$$instance_name = ' . $class_name . '::singleton();');
	}else{
		// singletonメソッドが無い場合はnewする
		$$instance_name = new $class_name();
	}
}

で、結局

PHP 5.3.0 以降では、変数を用いてクラスを参照することも可能です。 変数の値に (self や parent、 static といった) キーワードを指定することはできません。

らしいので、素直に書くにはPHP5.3.0以上でないとだめらしい

<?php
foreach($class_array as $class_name => $instance_name){
	if(method_exists($class_name, 'singleton')){
		// singletonメソッドが有る場合はsingletonメソッドを利用する
		// この書き方はPHP5.3.0以降でないと出来ない
		$$instance_name = $class_name::singleton();
		// PHP5.3.0より前の場合はこうやって無理くりやるしかないみたい
		eval('$$instance_name = ' . $class_name . '::singleton();');
	}else{
		// singletonメソッドが無い場合はnewする
		$$instance_name = new $class_name();
	}
}