ugrás a tartalomhoz

Php ArrayAccess private->public :o

inf · 2009. Már. 21. (Szo), 22.18
Üdv!

Röviden arról van szó, hogy az objectek nagy részén használni szeretném az ArrayAccess interfacet.

class cucc implements ArrayAccess
{
	protected $a=12;
	public $b=13;
	
	public function offsetExists($name)
	{              
		return isset($this->$name);
	}

	function offsetGet($name)
	{       
		return $this->$name;
	}

	function offsetSet($key,$val)
	{       
		$this->$key=$val;
	}

	function offsetUnset($name)
	{       
		unset($this->$name);
	}
}

$x=new cucc();
echo $x['a'];
echo $x['b'];
Az előnyei ennek, hogy a template rendszeremben nem kell a tömböktől elkülönítenem az objektumok tulajdonságait, hanem azonos módon meg tudom őket adni.

A hátránya pedig, hogy az ArrayAccess-el a private/protected tulajdonságok is lekérhetővé válnak. Ezt szeretném elkerülni valahogyan, de eddig nem jöttem rá, hogy mit lehet tenni.

Igazából az sem baj nekem, ha ArrayAccessel az objektumon belülről nem lehet elérni a private vagy protected tulajdonságokat, mert tényleg csak a külső elérésre használnám.
Az igazi megoldás az lenne, ha valahogy le lehetne kérdezni egy tulajdonságról, hogy az public vagy sem. Ha valaki tud erről valamit, az kérem jelezze.

Előre is kösz.
 
1

Közben megoldódott

inf · 2009. Már. 21. (Szo), 22.34

		$reflection=new ReflectionProperty($this,$name);
		if (!$reflection->isPublic())
		{
			throw new Exception('Trying to access non public property.');
		}
Nem hiszem, hogy ez a legtakarékosabb módja, de legalább működik.
Ha valaki tud rá más módot szívesen meghallgatom.
2

Kell ez így?

Protezis · 2009. Már. 22. (V), 01.48
Véleményem szerint rossz döntés így használni az ArrayAccess interfészt, azonban ha maradunk a fenti problémánál, akkor én a következő módon járnék el: mivel a private és a protected változókat, valamint metódusokat '_' prefixxel látom el alapból, így mindösszesen ennek a meglétét kell vizsgálni.
Persze kérdéses, hogy érdemes -e átírnod ennek megfelelően az összes osztály.

Ezen kívül lehet még trükközni esetleg egy másik osztály bevonásával:

class Property
{
	public static function getProperty( $object, $name )
	{
		return $object -> $name;
	}

	public static function issetProperty( $object, $name ) {...}
	...
}

class cucc implements ArrayAccess
{
	function offsetGet($name)  
	{         
		return Property::getProperty( $this, $name );  
	}
	...
}
3

Vagy inkább...

Sulik Szabolcs · 2009. Már. 22. (V), 15.07
... mondjuk így:

class Foo implements ArrayAccess
{
  protected $public_props = array();
  
  // ...

  function offsetGet($name)    
  {           
    return $this->public_props[$name];
  }

  // ...
}
Miért kellene bonyolítani?
4

Ez nem megoldás

Protezis · 2009. Már. 22. (V), 16.53
Így csak a public_props tömb értékeit éred el a tömbindex operátorral. Mi a helyzet a Foo::$a és a Foo::$b változókkal (fentebbi alapján 'cucc', de ez most lényegtelen)?

Én legalábbis úgy értelmeztem, hogy a cucc::$b értékét mind a $x->b, mind a $x['b'] módon el akarja érni, míg cucc::$a esetén mindkét módon hibát akar látni.

Hopp, nem oda ment, ahová akartam.
5

Értem én...

Sulik Szabolcs · 2009. Már. 22. (V), 20.32
... csak akkor itt valami koncepcionális bibi van. Minden objektumnak van egy publikus interface-e, akkor minek is ez? Így nézve viszont egyetértünk.
6

ha php > 5.1.2

carstepPCE · 2009. Már. 23. (H), 11.33
Ha emlekeim nem csalnak, akkor erre a __get() es __set() fuggvenyek kivaloan alkalmazhatoak.

-cs-
Sanyi
7

Hogy?

Protezis · 2009. Már. 23. (H), 19.31
Le tudnád írni, hogy gondoltad?
8

olvasasnak megfelel

carstepPCE · 2009. Már. 23. (H), 21.59
katt ide

igazabol ennek a ket metodusnak a hasznalataval, engedlyezheted a hozzaferest bizonyos vedett )private, protected) adatokhoz, tulajdonsagokhoz egy adott objektumban. Hasznalatara van rengeteg pelda a megjegyzesekben es a peldakban is. Eloszor en se nagyon ertettem, de erdemes szerintem utananezni, sajnos en nem tudok olyan jol fogalmazni, hogy osszefoglaljam neked a lenyeget, szerintem a peldak magukert beszelnek!

-cs-
Sanyi
9

Félreértesz

Protezis · 2009. Már. 23. (H), 22.33
Ismerem, és szoktam is használni ezeket a 'magic' metódusokat, csak azt nem tudom, hogy oldják meg a fenti problémát. Ezért lettem volna kíváncsi egy konkrét megoldásra.
10

egy pelda

carstepPCE · 2009. Már. 24. (K), 12.45
Hasonloan a te elso kommented beli hozzaszolashoz az en peldam is hibat dob:

public function __get( $propertyName )
{
	/**
	 * Virtual Properties like implementation of getters.
	 */
	switch ( $propertyName )
	{
		case "mainSignals":
		case "actionSignals":
			return $this->$propertyName;
		default:
			throw new pceServicePropertyNotFoundException( $propertyName );
	}
}
ami nem felel meg azokat szepen nem engedelyezem. Szerintem ezzel maximalisan szabalyozhatova valik a tulajdonsagok elerese, mind kivulrol, mind belulrol. Vagy a kivetel helyett ures stringet esetleg false-t dobsz vissza a te esetedben.

-cs-
Sanyi