對於php的文件調用,我們有時會為使用include, include_once, require, require_once而陷入斟酌,不僅初學者如此,高級工程是由也會有糾結的時候。而且至今使用哪一個為最優仍沒有達成共識。每個團隊每個項目有自己的代碼規范,也有自己的使用理由。至於四個函數的異同,在此不作贅述。
我們團隊推崇使用的是require_once,為什麼使用require_once而不是require呢。今日給出一個理由。
require的使用在多個子類繼承同一個父類時會引起redeclare的錯誤
因為require不是一個方法,而是一個語句塊。所以,他把把引用的文件執行一遍,所以,如果你在一個文件裡引用了兩個繼承自同一父類的類時,由會引起上述問題。而require_once則不會,它會先判斷是否引用過,苦有則略過。
看代碼,先寫一個抽象父類:
[php]
AbstractClass.php
AbstractClass.php<?phpabstract class AbstractClass{}
再實現兩個子類:
[php]
RequireClassA.php
<?php
//使用require而不是require_once
require 'AbstractClass.php';
class RequireClassA extends AbstractClass{
}
RequireClassA.php
<?php
//使用require而不是require_once
require 'AbstractClass.php';
class RequireClassA extends AbstractClass{
}
[php]
RequireClassB.php
<?php
//使用require而不是require_once
require 'AbstractClass.php';class RequireClassB extends AbstractClass{}
RequireClassB.php
<?php
//使用require而不是require_once
require 'AbstractClass.php';class RequireClassB extends AbstractClass{}
實現調用:
[php]
test.php
<?php
require_once 'RequireClassB.php';
require_once 'RequireClassA.php';
$A = new RequireClassA();
$B = new RequireClassB();
test.php
<?php
require_once 'RequireClassB.php';
require_once 'RequireClassA.php';
$A = new RequireClassA();
$B = new RequireClassB();
運行test.php報錯
[plain]
>php test.php
>PHP Fatal error: Cannot redeclare class AbstractClass in /home/john/workspace/php/require/AbstractClass.php on line 2
>php test.php
>PHP Fatal error: Cannot redeclare class AbstractClass in /home/john/workspace/php/require/AbstractClass.php on line 2