English 中文(简体)
消除PHP中全球关键词的必要性
原标题:Eliminating the need for the global keyword in PHP

我正在设计一个简单的PHP应用程序,设计MVC。 所有这些申请都寄至<代码>index.php,然后送交适当的控制员。 由于所有要求都通过<代码>index.php,我想在那里制造一些物体,并能够在全球范围内使用这些物体,而不论哪一个控制者处理这一请求。 即,这些物体为:<代码>User,ErrorHandlerDatabase

例如,有全球<代码>User类别,允许任何控制人核对用户在<代码>上登录的情况; 在(或类似)中,$userindex.php上公布。

我在法典中描述了这一点:

// index.php:

<?php
    include( lib/User.php );

    $user = new User();

    // other stuff that index.php needs to do, perhaps route to FooController
?>

// FooController.php:

<?php
    class FooController {
        function __construct() {
            global $user;        

            if ($user->loggedIn) {
                // do whatever
            }
        }
    }
?>

这只是随机的法典,我只是这样作,请说明任何拖延的错误——但我希望你会这样做。 该代码将发挥作用,但<代码>全球用户;项目必须列入内的每一功能。

如果每项职能必须有三条<条码>全球说明,其中一条为<代码>User, ErrorHandler<>/code>,。 在保持我的多国排雷中心设计的同时,是否还有更好的途径来做到这一点?

最佳回答

我最后说:

class BaseController
{
    public $user, $db, $errors;

    function __construct()
    {
         global $user, $db, $errors;

         $this->user = $user;
         $this->db = $db;
         $this->errors = $errors;
    }
}

每个控制员都向基地主计长(该主计长也有一些抽象的职能,这只是解决这一具体问题的基地主计长的一个例子。 这样,我只能一次使用<条码>全球<><>><>><>>,然后我可以使用每个控制器的用户、db和差错手机,简单地打上<条码>:每个控制器的构造人中__(......) 施工/代码,然后通过<条码>>,即“用户

问题回答

You hardly ever need global. Just don t create globals.

首先。 例如:

function __construct($user)
{ ... }

现在,你可以呼吁:

$controller = new MyController($user);

你们不需要全球。

如果你的控制者是管理你整个申请流动的控制者,甚至更好。 在此情况下,你只需要通过几个班子,例如一个数据库类别,并可能是一个供投入的教区。 如果你不关心此事,你就可以使控制者立即进入数据库和教区。 如果你需要支持多种类型的数据库和多种投入,那么你总是能够证明这一点。

然后,这些数据库可以作为控制人员的财产。 每个下班都知道这一控制器。 你们可以在全球,甚至更好的地方,把控制器放在其他班级的构造中,因此他们根本不依赖全球。

如果这些班级不需要一名控制员,但仅仅需要一个数据库,你只能通过数据库。 这将使这些班级更加独立于控制器和任何全球,因此,如果数据库本身(直接或间接)依赖控制器,则你可以很容易地在其他应用中使用。

Take a look at frameworks like Kohana. They solve these problems pretty well, although there s always room for improvement.





相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...