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
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php