Skip to content
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

Closed
phil-lavin opened this issue Jun 5, 2011 · 2 comments
Closed

Strange OO Code Logic #43

phil-lavin opened this issue Jun 5, 2011 · 2 comments
Labels

Comments

@phil-lavin
Copy link
Contributor

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

@phil-lavin
Copy link
Contributor Author

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:
phil@server1:~$ php statictest.php
NULL
string(3) "wah"

@jschreuder
Copy link
Contributor

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants