Is het in PHP mogelijk om velden ( properties ) als read-only in te stellen? Althans, om toegang tot te krijgen. Je hebt dus wel een Setter() nodig maar geen Getter(), dat je dus gewoon $object->property kunt gebruiken. Het enige is dan dat je dus niet: $this->property = new SomeObject(); kunt doen. Daar zou je dus de Setter() voor moeten gebruiken.. Iemand een ideetje?
De property/fied private maken, en alleen een setter gebruiken.
Je bovenstaande bericht is wat verwarrend..
Merijn Venema op 30/01/2012 21:24:06
Is het in PHP mogelijk om velden ( properties ) als read-only in te stellen? Althans, om toegang tot te krijgen. Je hebt dus wel een Setter() nodig maar geen Getter(), dat je dus ...
<?php
class SomeClass {
// The property private
private $prop;
// CTor
public function SomeClass($propVal)
{
// Set the property in the constructor
$this->prop = $propVal;
}
// GETTER
// Get the value or prop
public function GetProp()
{
return $this->prop;
}
}
?>
Ja maar zoals ik het bedoel is dat een property dus read-only is. Buiten een getter om toegankelijk. In bijvoorbeeld C# kun je handig en snel Getters en Setters maken die te benaderen zijn als properties. Voordeel? Het scheelt 2 haakjes en het oogt netter.
$object->GetProperty() is minder mooi als $object->property. Enige nadeel is dat de property dus ook te overschrijven is op die manier. In een Set methode kun je nog wat feitjes controleren etc, maar hier is het gewoon klats-boem hupakee, overschrijven.
__get en __set traag? Dat is dan net zo traag als getPropertyName(). En deze magic methods zijn JUIST om te overloaden :)
Maar als je van een C/C++ achtergrond oid komt dan zullen 'magic methods' je wel vreemd klinken inderdaad, PHP is zowat de enige taal die zoiets implementeert.
Je moet dan wel controleren of iets een read-only propertie is of niet (ik neem aan dat je niet alleen read-only properties hebt) en anders een Exception gooien:
<?php
class Example
protected $foo;
protected $ro_bar;
public function __get( $name )
{
$name = ( substr($name, 0, 3) !== 'ro_' ? 'ro_'.$name : $name );
if( isset($this->$name) )
return $this->$name;
else
throw new LogicException('You don't have permission to get the propertie '.$name);
}
}
$example = new Example;
$example->foo; // throw exception
$example->bar; // give the value of bar
?>
Is wel een lelijke methode, maar ik zou niet weten hoe je het anders moet implenteren.
Hmm goed punt. Ja ik denk dat je inderdaad nog iets nodig moet hebben dat er voor zorgt dat het als een read-only property hanteerbaar is... Aan de andere kant.. Nee, je hebt gelijk. Misschien is het sowieso beter om gewoon getters te hanteren. Ik zie de bui we hangen dat je straks wachtwoorden of sleutels in je object opgeslagen hebt met een private modifier en ze toch leuk uit kunt lezen..
Hmm hier moet wat op te verzinnen zijn. Misschien een _ op het einde?