Connecting Tech Pros Worldwide Forums | Help | Site Map

$stringVar::constant?

Gordon
Guest
 
Posts: n/a
#1: Jun 27 '08
I'm trying to get a constant from a class, where the constant's name
is known, but the class name isn't. I want to do things this way
because I want classes to be able to define certain aspects for their
setup themselves.

For example: I have a situation where I have a script that can deal
with objects of one of several classes, but each class needs some
slightly different setup parameters. I'm currently taking care of
this with a switch statement, but i'd like to eliminate it if at all
possible. As it stands, my code is along the lines of:

$thisClass = 'FirstClass'; // Will come from an external source in
real life, validated of course!

switch ($thisClass)
{
case 'FirstClass' :
$val = 'first val';
break;
case 'SecondClass' :
$val = 'second val';
break;
case 'ThirdClass' :
$val = 'third val';
break;
// ...
}

echo ($val);

I'd rather do something along the lines of

class FirstClass
{
const VAL = 'First val';
}
//...

echo ($thisClass::VAL);

I'm guessing that there is some function that returns a class from a
string, but I can't find it. Can anyone help out here?

Jerry Stuckle
Guest
 
Posts: n/a
#2: Jun 28 '08

re: $stringVar::constant?


Gordon wrote:
Quote:
I'm trying to get a constant from a class, where the constant's name
is known, but the class name isn't. I want to do things this way
because I want classes to be able to define certain aspects for their
setup themselves.
>
For example: I have a situation where I have a script that can deal
with objects of one of several classes, but each class needs some
slightly different setup parameters. I'm currently taking care of
this with a switch statement, but i'd like to eliminate it if at all
possible. As it stands, my code is along the lines of:
>
$thisClass = 'FirstClass'; // Will come from an external source in
real life, validated of course!
>
switch ($thisClass)
{
case 'FirstClass' :
$val = 'first val';
break;
case 'SecondClass' :
$val = 'second val';
break;
case 'ThirdClass' :
$val = 'third val';
break;
// ...
}
>
echo ($val);
>
I'd rather do something along the lines of
>
class FirstClass
{
const VAL = 'First val';
}
//...
>
echo ($thisClass::VAL);
>
I'm guessing that there is some function that returns a class from a
string, but I can't find it. Can anyone help out here?

Not real nice, but it can be done...

<?php

class FirstClass {
const VAL = 'First val';
}

class SecondClass {
const VAL = 'Second val';
}

$cname = 'FirstClass';
$str = $cname . '::VAL;';
eval('echo ' . $str . ';');
echo "\n";

$cname = 'SecondClass';
$str = $cname . '::VAL;';
eval('echo ' . $str . ';');
echo "\n";

?>

Outputs

First val
Second val

But I don't like it :-)

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================
Michael Fesser
Guest
 
Posts: n/a
#3: Jun 28 '08

re: $stringVar::constant?


..oO(Jerry Stuckle)
Quote:
>Gordon wrote:
Quote:
>I'm trying to get a constant from a class, where the constant's name
>is known, but the class name isn't. I want to do things this way
>because I want classes to be able to define certain aspects for their
>setup themselves.
>[...]
>>
>echo ($thisClass::VAL);
>>
>I'm guessing that there is some function that returns a class from a
>string, but I can't find it. Can anyone help out here?
>
>
>Not real nice, but it can be done...
>
><?php
>
>class FirstClass {
const VAL = 'First val';
>}
>
>class SecondClass {
const VAL = 'Second val';
>}
>
>$cname = 'FirstClass';
>$str = $cname . '::VAL;';
>eval('echo ' . $str . ';');
>echo "\n";
>
>$cname = 'SecondClass';
>$str = $cname . '::VAL;';
>eval('echo ' . $str . ';');
>echo "\n";
>
>?>
>
>Outputs
>
>First val
>Second val
>
>But I don't like it :-)
Neither do I. According to the manual this

echo $thisClass::VAL;

should become possible with PHP 5.3. Until then the Reflection API might
be another option, but I haven't tried it.

Micha
Gordon
Guest
 
Posts: n/a
#4: Jun 28 '08

re: $stringVar::constant?


On Jun 28, 3:13*pm, Michael Fesser <neti...@gmx.dewrote:
Quote:
.oO(Jerry Stuckle)
>
>
>
Quote:
Gordon wrote:
Quote:
I'm trying to get a constant from a class, where the constant's name
is known, but the class name isn't. *I want to do things this way
because I want classes to be able to define certain aspects for their
setup themselves.
[...]
>
Quote:
Quote:
echo ($thisClass::VAL);
>
Quote:
Quote:
I'm guessing that there is some function that returns a class from a
string, but I can't find it. *Can anyone help out here?
>
Quote:
Not real nice, but it can be done...
>
Quote:
<?php
>
Quote:
class FirstClass {
* * const VAL = 'First val';
}
>
Quote:
class SecondClass {
* * const VAL = 'Second val';
}
>
Quote:
$cname = 'FirstClass';
$str = $cname . '::VAL;';
eval('echo ' . $str . ';');
echo "\n";
>
Quote:
$cname = 'SecondClass';
$str = $cname . '::VAL;';
eval('echo ' . $str . ';');
echo "\n";
>
Quote:
?>
>
Quote:
Outputs
>
Quote:
First val
Second val
>
Quote:
But I don't like it :-)
>
Neither do I. According to the manual this
>
echo $thisClass::VAL;
>
should become possible with PHP 5.3. Until then the Reflection API might
be another option, but I haven't tried it.
>
Micha
Thanks. Further investigation turned up the eval() option but I
really don't like using eval(), especially on user-provided data, even
if it has been validated. You never know what you might have missed.
On the other hand reflection might be overkill...
Charles Calvert
Guest
 
Posts: n/a
#5: Jul 4 '08

re: $stringVar::constant?


On Fri, 27 Jun 2008 09:15:36 -0700 (PDT), Gordon
<gordon.mcvey@ntlworld.comwrote in
<de6b1e03-90aa-465f-89f1-6df9019b9ca4@c65g2000hsa.googlegroups.com>:
Quote:
>I'm trying to get a constant from a class, where the constant's name
>is known, but the class name isn't. I want to do things this way
>because I want classes to be able to define certain aspects for their
>setup themselves.
>
>For example: I have a situation where I have a script that can deal
>with objects of one of several classes, but each class needs some
>slightly different setup parameters. I'm currently taking care of
>this with a switch statement, but i'd like to eliminate it if at all
>possible. As it stands, my code is along the lines of:
>
>$thisClass = 'FirstClass'; // Will come from an external source in
>real life, validated of course!
>
>switch ($thisClass)
>{
case 'FirstClass' :
$val = 'first val';
break;
case 'SecondClass' :
$val = 'second val';
break;
case 'ThirdClass' :
$val = 'third val';
break;
// ...
>}
>
>echo ($val);
>
>I'd rather do something along the lines of
>
>class FirstClass
>{
const VAL = 'First val';
>}
>//...
>
>echo ($thisClass::VAL);
>
>I'm guessing that there is some function that returns a class from a
>string, but I can't find it. Can anyone help out here?
There are a couple of OO options, assuming that you're using php 5.

1. Inheritance. If you can make all of the classes inherit from a
base class, make the constant a member of the base class, then
override it in the derived classes. You can then access the constant
by assigning the instance of the derived class to a variable declared
as the base class.

2. Interface. If #1 isn't feasible, create an interface that contains
the required constant, then make each class implement that interface.
You can then access the instance of the class via a variable declared
as the interface.

See <http://www.php.net/manual/en/language.oop5.constants.phpfor
more info.
Closed Thread