PHP fóra: Builder | JakPsatWeb | Webtrh
Nejste přihlášen(a)
Zdravim,
mam kod, kde potrebujem ziskat hodnotu statickej premennej objektu, bez vytvorenia instancie objektu. Nazov objektu ale dostanem z databazy a tu nastava moj problem. Neviem ci je to mozne, ale sa to da zapisat.
<?php
class Product
{
public static $property = 'Foo';
}
$class = 'Product';
echo $class::$property; // tu nastava problem
?>
Vdaka za kazdu radu.
Na tohle potřebuješ PHP 5.3
Pokud vím dalo se to řešit i takovým hnusem:
$var = eval("return $class::\$property");
LM napsal(a):
Pokud vím dalo se to řešit i takovým hnusem:
$var = eval("return $class::\$property");
podarilo sa mi najst nieco take:
<?php
$class = 'Product';
$vars = get_class_vars($class);
echo $vars['property'];
?>
Jo, v PHP 5.3 som to videl, ale bohuzial nemozem updatnut. Eval mi tiez napadol, ale eval-u sa snazim vyhnut.
Vystrel do tmy:
A co udelat staticky getProperty() a pouzit funkci call_user_func() nebo call_user_method(). To by mohlo jit ne?
phx napsal(a):
Vystrel do tmy:
A co udelat staticky getProperty() a pouzit funkci call_user_func() nebo call_user_method(). To by mohlo jit ne?
Skus uviest priklad, ako to myslis. Moje riesenie funguje, ale ak sa to da vyriesit elegantnejsie, tak preco nie.
Myslím, že to bylo myšleno takto…
class Foo
{
static public $variable = 'value';
public static function getProperty($id)
{
if (!isset(self::${$id}))
throw new InvalidArgumentException("Static property '$id' of class '" . get_class() . "'does not exist");
return self::${$id};
}
}
function get_static_class_property($class, $property)
{
return call_user_func(array($class, 'getProperty'), $property);
}
$class = 'Foo';
$property = 'variable';
echo get_static_class_property($class, $property); // value
$property = 'bar';
echo get_static_class_property($class, $property); // InvalidArgumentException
$property = 'hidden';
echo get_static_class_property($class, $property); // secret! <- porušení zapouzdření
Ale v tomto případě by mohlo docházet k porušení zapouzdření,
protože jdou takto získat i hodnoty proměnných, které jsou
protected a private. Funkce
get_class_vars() vrací jen veřejné rozhraní objektu, tedy jen
proměnné public.
Osobně bych to tedy raději zobecnil do nějaké takové funkce…
function get_static_class_property($class, $property)
{
$vars = get_class_vars($class);
if (!isset($vars[$property]))
throw new InvalidArgumentException("Static property '$property' of class '$class'does not exist");
return $vars[$property];
}
Btw. call_user_method je deprecated…
Ja jsem to myslel podobne.
class Foo
{
static private $property = 'value';
public static function getProperty() {
return self::$property;
}
}
function get_static_class_property($class, $property)
{
return call_user_func(array($class, $property);
}
echo get_static_class_property('Foo', 'getProperty');
Coz by melo byt naprosto bezpecne.