J'ai rencontré un problème donc car je souhaite créer des classes à l'image du langage Java
Voici donc les classes et le code que j'ai réalisé :
object.class.php
[code]
<?php
/**
* Object
*
*/
class Object {
function __construct() { }
/**
* Return an array of class' properties
* @access public
* @param string $className optional
* @return array
*/
final static public function getProperties( $className=null ) {
$className = $className == null ? self::getName() : $className;
$array = get_class_vars( $className );
$tmp = array();
while(list($name, $notUsed) = each($array)) {
$tmp[] = $name;
}
return $tmp;
}
/**
* Return an array of class' methods
* @access public
* @param string/null $classname
* @return array
*/
final static public function getMethods( $className=null ) {
$className = $className == null ? self::getName() : $className;
$array = get_class_methods( $className );
return $array;
}
/**
* Return the class' name
* @access public
* @return string
*/
static public function getName() {
return __CLASS__;
}
/**
* Assign a value to a property
* @access public
* @param string/array $name
* @param mixed $value
*/
final public function set( $name, $value=null ) {
if(is_array($name)) {
$this->setFromArray($name);
}
else {
if(property_exists($this, $name)) {
$this->$name = $value;
}
else {
throw new Exception('Property doesn\'t exist(' . $name . ')');
}
}
}
/**
* Return a property's value
* @access public
* @param string $name
* @return mixed
*/
final public function get( $name ) {
$return = false;
if(property_exists($this, $name)) {
$return = $this->$name;
}
else {
throw new Exception('Property doesn\'t exist(' . $name . ')');
}
return $return;
}
/**
* Assign a value to several properties from an array
* @access public
* @param array $array
*/
final public function setFromArray( $array ) {
if(is_array($array)) {
while(list($name, $value) = each($array)) {
try {
$this->set($name, $value);
}
catch(Exception $e) {
throw new Exception($e->getMessage());
}
}
}
else {
throw new Exception('Wrong usage of setFromArray($array)');
}
}
/**
* Initialize an object
* @access public
*/
final public function reset() {
$array = get_class_vars($this->getName());
try {
$this->setFromArray( $array );
}
catch(Exception $e) {
throw new Exception($e->getMessage());
}
}
}
?>
[/code]
singleton.class.php
[code]
<?php
/**
* Singleton
*
*/
class Singleton extends Object {
/**
* Instance of Singleton
* @var resource
* @access public
*/
static public $instance = null;
function __construct(){
try {
$this->reset();
}
catch(Exception $e) {
throw new Exception($e->getMessage());
}
}
/**
* Return the class' name
* @access public
* @return string
*/
static public function getName() {
return __CLASS__;
}
/**
* Return the instance of Class
* @access public
* @return resource
*/
static public function getInstance() {
$className = self::getName();
try {
self::$instance = self::$instance == null ? new $className() : self::$instance;
}
catch(Exception $e) {
throw new Exception($e->getMessage());
}
return self::$instance;
}
}
?>
[/code]
site.class.php
[code]
<?php
/**
* Site
*
*/
class Site extends Singleton {
public $address = null;
public $name = null;
private $path = null;
function __construct(){
try {
parent::__construct();
$this->reset();
$this->setPath();
}
catch(Exception $e) {
//echo $e->getMessage();
throw new Exception($e->getMessage());
}
}
/**
* Return the class' name
* @access public
* @return string
*/
static public function getName() {
return __CLASS__;
}
/**
* Set the path property
* @access private
*/
private function setPath() {
$value = dirname(__FILE__);
try {
$this->set('path', $value);
}
catch(Exception $e) {
throw new Exception($e->getMessage());
}
}
}
?>
[/code]
le script
[code]
try {
$site = Site::getInstance();
$site->setFromArray( array("address" => "http://localhost/", "name" => "Titre du site") );
include_once("templates/header.php");
//var_dump(getClasses());
//var_dump($site);
include_once("templates/footer.php");
}
catch(Exception $e) {
//throw new Exception($e->getMessage());
echo $e->getMessage();
}
[/code]
Pour l'historique, j'ai surchargé getName() car quelquesoit la classe, le script me renvoyé toujours Object
Ensuite, j'ai du ajouté la fonction reset() dans le constructeur de chaque classe, fille de Object ; je rencontrais le même problème....
Et là, je suis paumé car l'exception Property doesn't exist(instance) est levée 

Dites moi où je fais fausse route 
Dailleurs, pourquoi j'ai une erreur E_STRICT lorsque le constructeur de Singleton est private tantdis que le constructeur de Object est public ?
Merci par avance