Ola,

Is er een manier om een class property af te dwingen?

Stel we hebben een abstracte class Bar. Hierin zou ik graag een abstracte class property in willen opnemen die door de child classes moet worden ingevuld. Dit lijkt echter niet te kunnen:

<?php
abstract class Bar {

abstract protected $bar;

}
?>
Zijn er andere mogelijkheden?
Oké, dan zou het inderdaad zoiets moeten worden. Ik had het handiger gevonden als je gewoon een property kon afdwingen, maar dan moet ik het inderdaad in zo'n soort oplossing gaan zoeken. Thanks!
Zo ben je er aardig zeker van dat getName() alleen maar correcte data terug geeft:

<?php

abstract class Miauw
{

protected $name;

final public function getName() // Final!
{
if ( ! is_string($this->name))
{
throw new DomainException(sprintf('%s::$name is of type %s, string expected', static::class, gettype($this->name)));
}

return $this->name;
}

}

class Goed extends Miauw
{

public function __construct()
{
$this->name = 'Yay!';
}

}

class Fout extends Miauw
{

public function __construct()
{
$this->name = 42;
}

}

try
{
$goed = new Goed();

var_dump($goed->getName());

$fout = new Fout();

echo $fout->getName();
}
catch (Exception $e)
{
var_dump($e->getMessage());
}

?>
thanks :)

Toevoeging op 09/12/2013 11:23:41:

static::class werkt niet?
Ah oke. Deze werkt overigens ook: get_called_class() Geen idee wat het verschil is met get_class($this) ?
Oh, die werkt ook ja. Zolang je __CLASS__ maar niet gebruikt, die geeft namelijk de class waar de aangeroepen methode gedefineerd is terug.

get_called_class() is beschikbaar vanaf PHP 5.3, de zelfde versie die namespaces introduceerde, dus je zit goed.

Edit: moest inderdaad get_called_class() zijn...
>> get_declared_class() is beschikbaar vanaf PHP 5.3, de zelfde versie die namespaces introduceerde, dus je zit goed.

Je bedoelt get_called_class?

Wat is trouwens beter, om een method te gebruiken, dus get_called_class()? Of zoals jij doet met static::class? En gaat het dan toevallig mis als je een class property met de naam $class hebt?
>> En gaat het dan toevallig mis als je een class property met de naam $class hebt?

Nee, ::class is de syntax in PHP5.5 betekend dat je de FQCN krijgt. (zie ook php.net) Een property is static::$class
Ah zo, oké. Is dat dan een soort vervanging voor de magic constant __CLASS__ ?
Nee, __CLASS__ gelde alleen voor de huidige class. ::class kan gebruikt worden in elke omstandigheid:
<?php
namespace Foo {
class Baz{
}
class Foo extends Bas
{
public function fiz()
{
echo $this::class; // Foo\Foo
echo static::class; // Foo\Bas
}
}

echo Foo::class; // Foo\Foo
}
?>

Reageren