-
Notifications
You must be signed in to change notification settings - Fork 96
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Strange OO Code Logic #43
Comments
I tried it out to be sure I wasn't missing an inadequacy of LSB in php5.3. It seems to work fine for me... <?php
class Foo {
protected static $foo = null;
public static function getFoo() {
return static::$foo;
}
}
class Bar extends Foo {
protected static $foo = 'wah';
}
var_dump(Foo::getFoo());
var_dump(Bar::getFoo()); Output is: |
The problem is as follows: when the parent class has the property but the child class doesn't the parent class's property is used. Then let's say we have the base Orm\Model and these 2 classes: <?php
class Orm\Model {
protected static $foo = 0;
}
class Foo extends Orm\Model {
public static function getFoo() {
return static::$foo;
}
}
class Bar extends Orm\Model {
public static function getFoo() {
static::$foo++;
return static::$foo;
}
} Note that these are 2 extension classes for the same base model which has the property, while neither of the child classes has the property. Foo::getFoo(); // 0
Foo::getFoo(); // 0
Bar::getFoo(); // 1
Bar::getFoo(); // 2
// And now for the big surprise
Foo::getFoo(); // 2 Thus by making the property part of the parent class you MUST extend it or its meaning will be ambiguous. Which is why the solution is used. [edit] And by the way, not meant to insult you: your use of "OO" is pretty strange to say it kindly. OO isn't a single way of doing things and when talking about static property one might even argue there's nothing OO about it. When you want to argue something don't use the term OO as a magic stick, it's not it has no meaning when used like this. Argue why you think something is good or bad and don't use a term you apparently only half understand and has no meaning in the context in which you use it. (what you meant to say is "inheritance", which of course is part of any OO design but is like using the word fruit when talking about apples) Last but not least: questions belong on the forums, not the issue tracker. |
There may be a good reason to do it the way it's done, but I thought I'd ask anyway.
In Orm\Model it has a number of commented out static properties and does property_exists() checks on them before assigning a default value. For example, line 113:
return property_exists($class, '_connection') ? static::$_connection : null;
Would the most efficient and object oriented way to do this not be to define $_connection as null and simply return it? This way, there's no overhead of doing a property_exists() and the property can be overridden.
Cheers
Phil
The text was updated successfully, but these errors were encountered: