Похоже, что вы действительно хотите, это подклассы или шаблон фабрики.
Например, вы можете иметь базовый объект продукта
class Product {
protected $_id;
protected $_sku;
protected $_name;
...
etc.
//getters and setters
etc.
}
... и затем использовать подклассы для расширения этого продукта
final class Book extends Product {
private $_isbn;
private $_language;
private $_numPages;
...
etc.
public function __construct() {
parent::__construct();
}
//getters and setters
etc.
}
Таким образом, типы ваших продуктов имеют все необходимые атрибуты, и вам не нужно пытаться использовать массив «атрибутов» - хотя ваша CMS должна иметь возможность поддерживать типы продуктов (так что если кто-то захочет добавьте новую книгу, поля, относящиеся к книгам, появятся в CMS) ... это лишь немного более оригинальный подход к проблеме.
Затем вы можете сделать это по фабрике; что-то вроде ( действительно базовый пример):
class ProductFactory {
const TYPE_BOOK = 'Book';
const TYPE_CD = 'CD';
const TYPE_DVD = 'DVD';
...
etc.
public static function createProduct($sProductType) {
if(class_exists($sProductType)) {
return new $sProductType();
}
else {
//throw an exception
}
}
}
Затем вы можете создавать новые продукты, например:
$oWarAndPeace = ProductFactory::createProduct('Book')
или еще лучше:
$oWarAndPeace = ProductFactory::createProduct(ProductFactory::TYPE_BOOK)