我是php-spanking-php中名称空间概念的新手。
情况: 文件夹中的多个文件,它们都需要/包含彼此用于自己的目的。
如果我将它们全部放在同一个命名空间中,是否仍然需要让它们相互要求/包含?
我确实想过用“use”替换require / include,但是在命名空间foo \ bar中有一个文件实际上'使用'foo \ bar ...似乎很奇怪... o_O
PS: 我通过提问来覆盖我的所有基础,同时也在网上寻找答案;所以,如果您有任何信息/教程等的良好来源,请随时分享。 :d
谢谢你, 大卫
答案 0 :(得分:2)
所有包含/要求可能会变得混乱。一个包含文件中包含的文件也将包含在第一个文件中,并显式调用它。我建议,如果你使用的是OOP方法,那就开始使用__autoload()
魔法。当您在页面上包含文件时,这将为您节省大量的麻烦,该页面已经包含在该页面上运行的其他位置,并且因此而导致500服务器错误。
答案 1 :(得分:1)
是的,您必须要求它们,或者您可以使用psr-0 compatible autoloader
答案 2 :(得分:1)
如果我将它们全部放在同一个命名空间中,是否仍然需要让它们相互要求/包含?
例如,您可以创建一个加载器类(这是我一直以来所做的,因此您只需要包含/要求它们一次,并且您只需要在控制器中包含/要求加载器类)。这是我正在使用的当前版本:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
//include alle classes
include("classes/db.class.php");
include("classes/gastenboek.class.php");
include("classes/gebruiker.class.php");
include("classes/bericht.class.php");
session_start();
$db = new Db();
//require smarty (smarty template engine)
require('plugins/smarty/Smarty.class.php');
$smarty = new Smarty;
$smarty->setCompileDir('smarty_compile');
$smarty->setTemplateDir('templates');
//func to dump var
function dump($var)
{
//echo ##
echo '<pre>##';
//print var
print_r($var);
//echo ##
echo '##</pre>';
}
以db.class为例:
<?php
class Db
{
//Loading Db
public function __construct()
{
//do connect()
$this->connect();
}
//connecting and selecting db
private function connect()
{
$connection = mysql_connect('localhost', 'user', 'pw');
if(!$connection)
{
die("Kan geen verbinding maken: " . mysql_error());
}
mysql_select_db("db", $connection);
}
public function DBH()
{
try
{
$DBH = new PDO('mysql:host=localhost;dbname=dbname', 'user', 'pw');
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $DBH;
}
catch (PDOException $except)
{
echo $except->getMessage();
}
}
index.php只需要这个:
include("includes/loader.php");