#1 před 2 lety

piler
Člen
Registrovaný: 30. 7. 2008
Příspěvky: 147

Ziskanie hodnoty statickej premennej z objektu

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.

 

#2 před 2 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5548

Re: Ziskanie hodnoty statickej premennej z objektu

Na tohle potřebuješ PHP 5.3

 

#3 před 2 lety

LM
Člen
Registrovaný: 11. 3. 2008
Příspěvky: 263

Re: Ziskanie hodnoty statickej premennej z objektu

Pokud vím dalo se to řešit i takovým hnusem:

$var = eval("return $class::\$property");

 

#4 před 2 lety

piler
Člen
Registrovaný: 30. 7. 2008
Příspěvky: 147

Re: Ziskanie hodnoty statickej premennej z objektu

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.

 

#5 před 2 lety

phx
Moderator
Registrovaný: 17. 4. 2008
Příspěvky: 878

Re: Ziskanie hodnoty statickej premennej z objektu

Vystrel do tmy:

A co udelat staticky getProperty() a pouzit funkci call_user_func() nebo call_user_method(). To by mohlo jit ne?

 

#6 před 2 lety

piler
Člen
Registrovaný: 30. 7. 2008
Příspěvky: 147

Re: Ziskanie hodnoty statickej premennej z objektu

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.

 

#7 před 2 lety

vlki
Člen
Registrovaný: 30. 6. 2008
Příspěvky: 239

Re: Ziskanie hodnoty statickej premennej z objektu

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…

 

#8 před 2 lety

phx
Moderator
Registrovaný: 17. 4. 2008
Příspěvky: 878

Re: Ziskanie hodnoty statickej premennej z objektu

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.

 

Zápatí