Tuesday, August 28, 2007

php5 likes transitive access levels?

When working on a singleton class in php, I noticed a funny behaviour.
The following code will lead to an error

Access level to B::__construct() must be public (as in class A)


class A
{
public function __construct(){}
}
class B extends A
{
private function __construct()
{
parent::__construct();
}
}
$B = new B();
?>

Weird...

3 comments:

Anonymous said...

class A
{
private function __construct(){}
}

$A = new A();

funktioniert doch auch nicht - was ist da weird?

Sebastian Edelmeier said...

Sicher, der gedachte Nutzen eines privaten Konstruktors ist auch eigentlich im singleton pattern, also so:

class A
{
public function __construct(){}
}

class B extends A
{
private static $instance = NULL;

private function __construct()
{
parent::__construct();
}
public static function instance()
{
if (self::$instance==NULL)
self::$instance = new B();
return self::$instance;
}
}
$B = new B();
?>

war von mir etwas unglücklich ausgedrückt...

Sebastian Edelmeier said...

die letzte Zeile sollte demnach auch heissen:

$B = B::instance();