选择要在php OOP设计中使用的类

选择要在php OOP设计中使用的类,php,performance,oop,procedural,Php,Performance,Oop,Procedural,我经营一个街机网站,在过去的几年里,它增加了许多功能,程序编程看起来太复杂了,添加新功能或进行简单的设计修改可能非常棘手 因此,我决定尝试用相同的功能从头开始重新编码站点,但采用OOP格式 我的问题是选择课程,我理解OOP以及它应该如何工作,但似乎总是在开始时遇到困难。我不确定我是否应该尝试为类创建函数,例如带有登录用户函数的用户类,或者用户类是否应该只是添加/更新/显示用户详细信息,并且登录部分在系统类中会更好 目前,我已经开始使用下面的类和函数,但是它们是否适合这个类别 <? clas

我经营一个街机网站,在过去的几年里,它增加了许多功能,程序编程看起来太复杂了,添加新功能或进行简单的设计修改可能非常棘手

因此,我决定尝试用相同的功能从头开始重新编码站点,但采用OOP格式

我的问题是选择课程,我理解OOP以及它应该如何工作,但似乎总是在开始时遇到困难。我不确定我是否应该尝试为类创建函数,例如带有登录用户函数的用户类,或者用户类是否应该只是添加/更新/显示用户详细信息,并且登录部分在系统类中会更好

目前,我已经开始使用下面的类和函数,但是它们是否适合这个类别

<?
class User {

    var $userId,
        $username,
        $userRole,
        $userEmail;

    function isLoggedIn(){

    }

    function login($postusername, $postpassword)
    {

    }

    function increaseLoginCount(){

    }

    function logout(){

    }
}
?>

然后,我可以在page.php中使用如下内容。。(未显示连接类)


但是这个网站会有页面来显示游戏类别,我不知道displayGames()函数应该放在哪里,因为它不是一个单一的游戏,所以不会放在“游戏”类中


我试图找到“真实世界”的例子,但php代码告诉我如何让大象改变颜色或跳舞并没有真正的帮助…

用户类中的所有成员看起来都属于那里。将gui代码与其他代码分开很重要,我将displayGames()放在某种gui类中。

OOP就是要确定责任区域,并构建独立的代码单元来处理这些区域中的一个,而且只有一个。一般的经验法则是,系统中的每个对象都应该在现实世界中体现一个等价的对象或概念,但这并不总是正确的,因为您还需要担心使系统工作所需的抽象事物(这里我指的是抽象,因为它们不代表业务逻辑的一项,但仍然需要使系统工作。我指的不是抽象类,它是其他的东西)

例如,在您的游戏网站中,您可能需要处理游戏、用户、版主、帐户、评论、评论等。其中每一个都应该是一个类,并且该类的每个实例都应该代表特定的用户、游戏、评论等

但是类有责任区,如上所述,类应该处理其责任区而不是其他。呈现页面不是上面提到的任何对象类的责任。这就是不代表系统实体的类的作用。Pag可能需要一个类e、 一个用于会话的类,一个用于数据库连接的类(尽管PHP已经介绍了PDO和其他一些DB模块,如mysqli)

要呈现页面,您需要使用页面类的实例。您可以向它传递对登录用户对象的引用、对希望显示的任何游戏对象的引用,等等。然后您可以让它呈现实际的HTML。页面类不需要知道任何关于您传递的对象的内部工作方式,除了关于这些对象公开的PI(在OOP圈子中称为对象的协议,换句话说,是它们的公共方法和属性)。一个(非常基本的)页面类可能如下所示:

class Page
{
    private $user = NULL;
    private $games = array ();

    public function setUser (User $user)
    {
        $this -> user = $user;
    }

    public function getUser ()
    {
        return ($this -> user);
    }

    public function addGame (Game $game)
    {
        $this -> games [] = $game;
    }

    public function getGames ()
    {
        return ($this -> games);
    }

    public function generate ()
    {
        $user = $this -> getUser ();
        $games = $this -> getGames ();

        $pageFile = '/path/to/a/php/script/representing/the/page/markup.php';
        require ($pageFile);
    }

    public function __construct (User $user, array $games)
    {
        $this -> setUser ($user);
        foreach ($games as $game)
        {
            $this -> addGame ($game);
        }
    }
}
<html>
    <head>
        <title>Games page for <?php echo ($this -> user -> getName ()); ?>
    </head>
    <body>
    <p>Hello, <?php echo ($this -> user -> getName ()), here are your games.</p>
    <?php if (count ($this -> games)) { ?>
    <ul>
        <?php foreach ($this -> games as $game) { ?>
        <li><?php echo ($game -> getName ()); ?>: your best score is <?php echo ($game -> getHighScore ($this -> user)); ?></li>
        <?php } ?>
    </ul>
    <?php } ?>
    </body>
</html>
实际的markup.php脚本可能如下所示:

class Page
{
    private $user = NULL;
    private $games = array ();

    public function setUser (User $user)
    {
        $this -> user = $user;
    }

    public function getUser ()
    {
        return ($this -> user);
    }

    public function addGame (Game $game)
    {
        $this -> games [] = $game;
    }

    public function getGames ()
    {
        return ($this -> games);
    }

    public function generate ()
    {
        $user = $this -> getUser ();
        $games = $this -> getGames ();

        $pageFile = '/path/to/a/php/script/representing/the/page/markup.php';
        require ($pageFile);
    }

    public function __construct (User $user, array $games)
    {
        $this -> setUser ($user);
        foreach ($games as $game)
        {
            $this -> addGame ($game);
        }
    }
}
<html>
    <head>
        <title>Games page for <?php echo ($this -> user -> getName ()); ?>
    </head>
    <body>
    <p>Hello, <?php echo ($this -> user -> getName ()), here are your games.</p>
    <?php if (count ($this -> games)) { ?>
    <ul>
        <?php foreach ($this -> games as $game) { ?>
        <li><?php echo ($game -> getName ()); ?>: your best score is <?php echo ($game -> getHighScore ($this -> user)); ?></li>
        <?php } ?>
    </ul>
    <?php } ?>
    </body>
</html>

游戏网页
你好,,
  • :你的最好成绩是
正如您可能已经注意到的,如果您使用这种方法,那么应用程序的模块将倾向于分为三类:业务逻辑对象(如用户和游戏)、显示逻辑(如markup.php文件)和第三类(如页面类)作为粘合逻辑和协调的形式

虽然在这种特殊情况下,它是特定于您的站点的,但如果您进一步推广这种方法,它将落入称为MVC的设计模式中,它代表模型、视图、控制器(实际上,对于表示、抽象和控制器来说,它更接近于一种称为PAC的模式,但出于某种原因,它在PHP社区中几乎总是被称为MVC,所以我们现在只说MVC).模式是程序员经常遇到的一类问题的概括,有一套现成的解决方案是很方便的

在游戏应用程序中,用户和游戏是模型,页面是控制器,markup.php是视图。如果将不同的markup.php脚本替换为此代码,则可以使用它以完全不同的方式表示完全相同的数据,例如XML文件。您还可以使用相同的模型和不同的控件让他们做不同的事情。这里需要记住的重要一点是,模型本身不应该关心它们是如何被使用的,这样它们就可以根据控制器需要实现的目标以不同的方式被使用

由于MVC是一种模式,因此已经有用于构建MVC的工具包(尽管它们不是真正的MVC;)PHP中的应用程序。这些被称为框架。有很多可供选择,例如Symfony、codeignator、Zend框架等等。现在最流行的框架是Zend,尽管我个人并不喜欢它。(我要说的是,Zend Framework 2的测试版看起来确实比当前版本的框架要好得多)


我希望这对你有所帮助。我知道OOP一开始会让人望而生畏。它确实需要你改变作为程序员的思维方式,但别担心,这需要足够的实践。

GordonM的文章是一篇很好的入门文章。我当然会推荐使用e
 /**
  * @package command.modules.games
  */
 function ListGamesCommand(Request $request, Response $response)
 {
     $application = $request->getApplication();
     $user = $application->getSession()->getUser();
     $games = $application->getModels()->build('games');
     $games = $games->findByUser($user);
     $response->setProp('games', $games);
 }
$request  = new Request($_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_ENV);
$response = new Response;
     .---------.                            .-------------.
     | website |  ---> [interface in ] ---> | application |
     | user    |  <--- [interface out] <--- |             |
     `---------´                            `-------------´
[Interface In]  Plain Text HTTP request
[Application]   Free to go
[Interface Out] Plain Text HTTP response