Php 包装非类代码的最佳实践
在类中包含和/或包装非类的好模式是什么?例如,我需要使用这个php文件登录到我的phpbb板。具体地说,我需要这个文件来引导phpbb,然后我将使用$user和$auth变量来登录用户。在我的代码中,我有一个AuthClient类 我试图找出最佳实践,从phpbb中包含common.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
获取错误:
[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;
}
}