Beste leden,

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 ...
Ja dat werkt natuurlijk niet. Als iets private is is het niet buiten de klasse toegankelijk.

$object = new Object();

// moet wel kunnen
echo $object->property;
// moet niet kunnen
$object->property = "Some value";
Ja, nee....

ik bedoel:

Een private property maken, en een getter:

<?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.
Ah kijk, ik had al een grijs vermoeden. Maar is dat niet vrij traag? __get en __set zijn toch een beetje no-go methodes om te overloaden?
__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.
Oke, dus eigenlijk is het vrij veilig om te implementeren? Heb het al even toegevoegd:


<?php

public function __get($name){
	if($this->{$name}){
        	return $this->{$name};
      	}
}

?>
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?

Reageren