Re: Class privacy and variable identifiers
| From: | Jochem Maas | Date: | Mon, 23 Oct 2006 20:34:41 +0000 |
| Subject: | Re: Class privacy and variable identifiers | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-243501@lists.php.net to get a copy of this message | ||
David Morse wrote:
> I have two somewhat general questions about the PHP 5
> language. These points remain unclear to me after reading
> the manual and working with the language for a few months:
>
> i) Does the language provide a way to generate a private or
> local class that is accessible only within another function
> or a parent class.
no. classes are global. as an aside there *may* be namespaces in php
in the future.
In python, for example, if you declare a
> class or function within a function definition, I believe it
> is accessible only within the parent function. Does PHP 5
> supply a good way to generate a little utility class without
> polluting the public namespace? Or are local variables in
> functions, class methods and class properties the only
> entities that can be hidden from public access?
no - may an assoc array would suffice your needs? many people
use static classes to contain sets of [utility] functions as a
sort of poormans namespacing ... helps to cut down pollution a little.
>
> ii) Suppose I would like to be able generate any of several
> classes at runtime, for which constructor interfaces are the
> same. These might, for example, be specialized subclasses of
> a common parent. Based on the idea of a variable variable,
> I am tempted to try to replace the class name by a variable,
> as in
>
> $object = new $class_name_variable($param1,$param2,....)
works.
>
> Is this legal PHP 5? Put another way, are variable names the
> only identifiers that can be replaced by string values of
> other variables, or is the technique more general? For instance,
> how about accessing a property or method by a name that is
> specified by a variable, as in:
>
> $object_instance->$property_name_variable
works.
>
> or
>
> $object_instance->$method_name_variable()
works.
please get into the habit of testing stuff like this
(get yourself a linux shell and read up on using php on the cmdline :-):
php5 -r '
class myObject {
const MY_CNST = "a";
public $myProp = "b";
public function myMethod() { return "c1"; }
public static function myStaticMethod() { return "c2"; }
}
$f = "MY_CNST"; $c = "myObject"; $p = "myProp"; $m =
"myMethod"; $s = "CNST"; $MY_CNST = "f";
print_r($o = new $c());
echo join(", ", array(
constant(get_class($o)."::${${"MY_$s"}}"),
$o->$p,
$o->$m(),
constant("$c::MY_CNST"),
$o->{"myProp"},
call_user_func(array($c, "myStaticMethod")))),"\n";
'
>
> The idea of a 'variable variable' name seems quite useful,
be careful with varvars ;-)
see also:
http://php.net/call_user_func
http://php.net/call_user_func_array
> but I'm not sure how general the concept is. Is there a
> well-defined rule for when the parser will accept a string
> value of a variable as a replacement for a literal
> identifier. If so, is the rule documented?
somewhere on php.net no doubt :-/
>
> Thanks in advance for any insight.
>
> -David Morse