开发者

Combining multiple classes gives me errors in PHP?

I'm creating a website with structure like this:

class main { }

class m开发者_如何学Pythonysql extends main { }

class user extends main { }

class etc extends main { }

The idea is for these classes to use functions from each other. This doesn't work. How can I call a function from mysql in user?

EDIT: All errors are similar to this one:

Fatal error: Call to undefined method user::function_in_mysql() in C:\foo.php on line 8

Martti Laine


The idea is for these classes to use functions from each other.

That's not what you're doing: Inheritance goes only one way. mysql, user, and etc inherit mains abilities but not those of each other.

You could have mysql extend user extend etc so that at least mysql can call all the functions but that probably won't make sense, as I think they are not ancestors but siblings to each other, fulfilling a distinctly different function.

You would have to either define any shared methods in main - often the best way to go - or introduce the classes to each other so they're able to call each other's functions. You could, for example, add an instance of each needed class as parameters to the constructor:

$etc = new etc();
$mysql = new mysql($etc);

// mysql's constructor sets $this->etc 
// so that it can call etc's functions using $this->etc->function()

or, more complex, using the dependency injection or singleton patterns. I asked a related question some time ago about how to deal with this in PHP and got a lot of feedback, maybe it gives you some inspiration.


Having a class extend another makes the methods of the other (parent) available to it. So user extending main only makes the methods of main available to it. If other classes extend main it doesn't allow all of them to call each others methods. You could have user extend mysql and mysql's methods would then be available to user though I don't believe that fundamentally this is what you're looking for.

I think you're looking for something along the lines of dependency injection and not class inheritance.

For example if you wanted your user class to have access to your mysql class you pass it an instance of it in it's constructor.

class user {
    protected $_mysql;

    public function __construct(mysql $mysql) {
        $this->_mysql = $mysql;
    }

    public function myMethod() {
        $this->_mysql->myMysqlMethod();
    }
}

$mysql = new mysql();
$user = new user($mysql);

$user->myMethod();

Here's some good reading on dependency injection.

  • PHP Dependency Injection
  • Symphony Dependency Injection

The Symphony link in particular is a pretty nice read on the overview of dependency injection and how to setup a dependency container.


That's not how extending a class works. All the functions that should exist in all classes should be part of main. Then functions that are specific to mysql go in that class. I'm guessing that the classes are not as closely linked in terms of inheritance as you think. If the user class needs to make calls through your mysql class, have a variable in the user class that holds a mysql object.


To call a function from mysql inside of user you could create an mysql object inside of user and call the function.

<?php
// this is user.php
$var = new mysql(); // <--if it takes parameters in the constructor
$var->method();
...
?>

For a better answer could you provide more information, as in, what errors are you getting?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜