Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 包装非类代码的最佳实践_Php_Oop_Design Patterns_Phpbb3 - Fatal编程技术网

Php 包装非类代码的最佳实践

Php 包装非类代码的最佳实践,php,oop,design-patterns,phpbb3,Php,Oop,Design Patterns,Phpbb3,在类中包含和/或包装非类的好模式是什么?例如,我需要使用这个php文件登录到我的phpbb板。具体地说,我需要这个文件来引导phpbb,然后我将使用$user和$auth变量来登录用户。在我的代码中,我有一个AuthClient类 我试图找出最佳实践,从phpbb中包含common.php并在我的类中使用它: ==========根据反馈进行编辑====================== 我相信我已经有所改进,但仍然不起作用。 获取错误: [2013-09-05 14:28:49] log.E

在类中包含和/或包装非类的好模式是什么?例如,我需要使用这个php文件登录到我的phpbb板。具体地说,我需要这个文件来引导phpbb,然后我将使用$user和$auth变量来登录用户。在我的代码中,我有一个AuthClient类

我试图找出最佳实践,从phpbb中包含common.php并在我的类中使用它:

==========根据反馈进行编辑======================

我相信我已经有所改进,但仍然不起作用。
获取错误:

[2013-09-05 14:28:49] log.ERROR: exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Cannot redeclare class auth' in /var/www/phpbb3/includes/auth.php:24
Stack trace:
#0 [internal function]: Illuminate\Exception\Handler->handleShutdown()
#1 {main} [] []
这引用bootstrap.php加载的非命名空间类

https://github.com/widop/phpbb3/blob/master/common.php
https://github.com/widop/phpbb3/blob/master/includes/auth.php
bootstrap.php LoginController.php-Laravel AuthClient.php
将代码放入构造函数意味着:

  • 无论何时创建
    新的AuthClient(),您将执行相同的代码,定义已经定义的常量等,这是一个非常糟糕的想法,并触发一个错误

  • 此外,方法可以是静态的,因此,如果不创建对象的完整性,则不会执行代码

  • define('IN_PHPBB', true);
    $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
    $phpEx = substr(strrchr(__FILE__, '.'), 1);
    include($phpbb_root_path . 'common.' . $phpEx);
    
    class AuthClient implements IAuthClient{
    
    protected $user;
    protected $auth;
    
    }
    
通常最好将与类无关的代码移到外部,因为有时您不需要任何东西,只需要类功能。它也更好,因为类的文件不需要多次包含,这将防止重复执行代码

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);

class AuthClient implements IAuthClient{

protected $user;
protected $auth;

}

在类中包含文件是一种不好的做法,因为它将类与要包含的文件耦合在一起,因此无法重用。一种方法是将类存储在单独的文件中,并使用如下构造函数(authclient.class.php):

然后创建另一个文件,其中包括phpbb文件和类,然后实例化类

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include('authclient.class.php');

$authClient = new AuthClient($user, $auth);
// do further processing with your authclient here

通过这种方式,您可以很好地分离单个关注点(phpbb、类声明、业务逻辑)。如果你有更多的自定义类,你可以使用自动加载器来自动包含你的类。

你为什么要这样做?您的文件是如此核心的过程,您不能只是复制内容并将其传递到方法中,这种神奇不会发生

它不是来自common.php本身,而是来自整个应用程序

如果您有:

fila:a.php:

$a = 100;
function double($a) {
return $a*2;
}
文件b.php

include "a.php";
$b = double($a);
echo $b; // 200
如果您希望b.php成为一个类(?),那么实现这一点的糟糕方法是:

Class B {
    private $_b;

    public function __construct() {
        include "a.php";
        $this->_b = double($a);
    }

    public function double() {
        return $this->_b;
    }
}
您必须重构包含的文件以与对象方式兼容:

Class A {
    public function double($a) {
        return $a*2;
    }
}
Class B {
    private $_a;
    private $_b;
    private $_inst;

    public function __construct() {
        $this->_a = 100;
        $this->_inst = new A();
    }

    public function double($a) {
        $this->_b = $this->_inst->double($this->_a);
        return $this->_b;
    }
}
在代码中,有很多函数只是函数,而不是方法或类实例。您试图通过将它们包含在构造函数中来访问它们,但这不会发生

User、Auth、Template等的实例应该注入构造函数中,或者注入到使用依赖关系的单独方法中。在代码中,$user和$auth是无状态的,它们不会成为相关类的实例


如果要将代码重构为类,必须坚持面向对象的方式。如果不这样做,那么就不要将代码注入类中,这不会使它更易于重用。

在OO中定义
是用
const MY_const=…在类中声明常量。
PHP不是Java,如果没有意义,就不应该将所有内容都放在类中。根据注释,您希望您的代码与PHP4兼容。正如您已经知道的,PHP5上的OO与PHP4非常不同。我正在编写代码,不仅可以将用户登录到我的主站点,还可以将他们登录到子系统(本例中为phpbb)。为此,我创建了一个IAuthClient类。子系统将实现这个类,当登录被执行时,它将循环通过所有注册的AuthClient和login。因此,在我的例子中,尝试将这个phpbb登录逻辑表示为一个类是有意义的。即使有点棘手,$user和$auth都来自包含的common.php文件。我怎样才能用这种方法让他们进入课堂的范围?在我的代码中,我将调用new AuthClient();我猜通过自动加载phpbb会在哪一点发生引导加载?只需为此创建一个合适的构造函数:
\u构造($user,$auth){}
,并通过
新建AuthClient($user,$auth)创建实例我认为这让我非常接近,但我仍然有一个问题我在上面描述过。我认为在包含的common.php中缺少名称空间是一个问题。不知道如何克服这一点。请发布完整的堆栈跟踪,但有两次这一行的地方除外
使用myproject\models\phpbbb\Phpbb从类文件中删除它可能会起作用
$a = 100;
function double($a) {
return $a*2;
}
include "a.php";
$b = double($a);
echo $b; // 200
Class B {
    private $_b;

    public function __construct() {
        include "a.php";
        $this->_b = double($a);
    }

    public function double() {
        return $this->_b;
    }
}
Class A {
    public function double($a) {
        return $a*2;
    }
}
Class B {
    private $_a;
    private $_b;
    private $_inst;

    public function __construct() {
        $this->_a = 100;
        $this->_inst = new A();
    }

    public function double($a) {
        $this->_b = $this->_inst->double($this->_a);
        return $this->_b;
    }
}