If anybody has a better (nicer) way of doing this, I would be pleased to know ;)
/**
* Returns the Fields of a class
*/
static function getFields($classname) {
$tablename = self::getTableName($classname);
return $GLOBALS["fields_of_".$tablename];
}
/**
* Saves the fields of a table in a global Array
*/
static function setFields($tablename, $fields) {
$GLOBALS["fields_of_".$tablename] = $fields;
}
I just don't have a solution for my second problem: I don't want to supply $classname as Parameter when calling:
testTable::toHtml_table_heading($dbConnect, "testTable");
André
André Pletschette wrote:
Thanks Jochem, I now solved the problem with your help, the following way:
In the parent-class I define:
static function getTableName($classname) { if (defined("$classname::TABLE_NAME")) { return(constant("$classname::TABLE_NAME")); } else { throw new Exception("No TABLE_NAME for ".$classname." defined!"); } }
And in each child-class I define, the const TABLE_NAME.
Now I have two more problems:
- I have to pass the Classname as a parameter to all my static functions:
for Example: echo testTable::toHtml_table_heading($dbConnect, "testTable");
- I need a similar thing for an Array $fields, which contains the field descriptions of the class:
static function toHtml_table_heading($dbConnect, $classname) {
$result = "\n\t<tr>";
if (!isset("$classname::$fields")) {
$classname->intializeClass($dbConnect, $classname);
}
...
Thankyou, André
Jochem Maas wrote:
André Pletschette wrote:
Hi,
I've got one function getTableName() which returns the Database-Table with the data of a class (see below).
As you can see it always calls the static $tablename of the subclass described by $this->classname.
I solved this problem by doing the following:
abstract class DBTable { // we can't define abstract consts. // but this must be defined in your subclass // const TABLE_NAME = 'xxxxx';
// define this func in your subclasses abstract function getTableName(); }
class C1 extends DBTable { function getTableName() { return self::TABLE_NAME; } }
it seems like a crap way of doing it but its very flexible and easy to understand (it just doesn't have that certain 'je ne c'est quoi') - none the less it was born out of a need for major flexibility (for pretty much similar reasons to you - namely generic data objects), anyway it gives you many ways to skin the cat (get the tablename):
<?
$c = new C1;
echo $c->getTableName(); echo C1::getTableName(); echo C1::TABLE_NAME;
$a = 'C1';
if (defined("$a::TABLE_NAME")) { echo constant("$a::TABLE_NAME"); }
if someone has a better way, bring it on :-) I'd love to be able to improve my own code.
You may also want to look at the possibility of using class names that are always indentical to the table names - I tried that but I didn't like it.
Thankyou, André
Here the function:
function getTableName() { if ($this->classname == "class1") { return class1::$tablename; } elseif ($this->classname == "class2") { return class2::$tablename; } elseif ($this->classname == "class3") { return class3::$tablename; }... ... }else { throw new Exception($this->classname." not found!"); } }
-- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php