你沒有必要使用class_alias
或聲明的靜態方法。一個基本的工廠班可以幫助你。
class RulesFactory
{
/*
public function __construct($validNames = array('IT', 'DE', 'EN')) {
// ...
}*/
public /*static*/ function build($rules_name)
{
$className = "Rules_" . strtoupper($rules_name);
if(class_exists($className)) {
return new $className();
} else {
throw new InvalidArgumentException("Invalid rules name given.");
}
}
}
interface Rules
{
public function myMethod();
public function getParam($name);
}
abstract class AbstractRules implements Rules
{
protected $param = [];
public function getParam($name, $default = null)
{
if (isset($this->param[$name])) {
return $this->param[$name];
} else {
return $default;
}
}
}
class Rules_IT extends AbstractRules
{
protected $param = ['MYCONST_1' => 5, 'MYCONST_2' => 3, 'MYCONST_3' => 10];
public function myMethod()
{
return 'Something';
}
}
class Rules_DE extends AbstractRules
{
protected $param = ['MYCONST_1' => 3, 'MYCONST_2' => 2, 'MYCONST_3' => 15];
public function myMethod()
{
return 'Something different';
}
}
您可以使用隨:
$factory = new RulesFactory();
$rules = $factory->build('IT');
echo $rules->myMethod(), "\n";
echo $rules->getParam('MYCONST_1');
您也可以聲明RulesFactory::build
作爲一個靜態方法,在這種情況下,你可以使用它作爲
RulesFactory::build('IT')->myMethod();
MISC:
爲什麼使用getParam
而不是使用常量?
因爲它給你一個更靈活的方式來定義和調用這些參數。例如:
abstract class AbstractRules implements Rules
{
protected $param = [];
public function getParam($name)
{
if (isset($this->param[$name])) {
return $this->param[$name];
}
throw new InvalidArgumentException("$name parameter doesn't exists.");
}
public function hasParam($name)
{
return isset($this->param[$name]);
}
public function addParam($name, $value)
{
$this->param[$name] = $value;
}
}
靜態屬性不相關聯的一類的任何特定實例/對象,它們屬於類本身。你可能不想要這個。但是,如果你這樣做,你可以簡單地這樣做:
class Rules_IT extends AbstractRules
{
const MYCONST_1 = 5;
const MYCONST_2 = 3;
const MYCONST_3 = 10;
public function myMethod()
{
return 'Something';
}
}
$rules = (new RulesFactory())->build('IT');
echo $rules::MYCONST_1;
爲什麼要使用一個接口「規則」?有什麼好處?
接口是表示合同義務的一種方式。 Why would I want to use Interfaces?。你已經可以利用這一優勢具有:
public function build($rules_name)
{
$className = "Rules_" . ucwords($rules_name);
if(class_exists($className)) {
$object = new $className();
if (!$object instanceof Rules) {
throw new InvalidArgumentException("$className must implement Rules interface");
}
return $object
}
throw new InvalidArgumentException("Invalid rules name given.");
}
我建議你閱讀關於編程的更多的書 - 如THI上http://www.amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124/ref = sr_1_fkmr0_1?s = books – Danack