来自ActionScript 3的强大背景,需要/导入将在另一个类中引用/使用/扩展的类的过程如下:
import package.inner.ClassName;
这需要在每个使用ClassName
的外部类文件的顶部,这意味着如果我执行以下任何操作,则需要它,例如:
public class NewClass extends ClassName
var someVar:ClassName = new ClassName();
function someMethod():ClassName{ .. }
等
我对PHP有一定的了解,即我知道如何使用它来处理MySQL,输出文本,编写函数,设置一些基本类等等。
我总是只有一个小型网站的主要课程,我在网页顶部创建了一个实例,并从那里开始工作,例如:
<?php
class Website
{
public function __construct()
{
// connect to mysql, etc
}
public function example()
{
echo "example text";
}
}
?>
然后:
<?php
require "whatever/class.website.php";
$website = new Website();
?>
<!doctype html>
<html>
<head>
<title>Example</title>
</head>
<body>
<?php
$website->example();
?>
</body>
</html>
这很好,但现在我想开始转向一些有多个类的大型项目。起初我没事,但在尝试为多个类设置基类之后,我遇到了一个问题:
举个例子,我设置了以下基类:
class Base
{
public function test($input)
{
echo $input;
}
}
从那里我设置了一个扩展它的类:
require "class.base.php";
class ExampleOne extends Base
{
public function __construct()
{
$this->test("example one");
}
}
然后检查是否所有工作都按预期工作,它做了:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<?php
require "class.exampleone.php";
$one = new ExampleOne();
?>
</body>
</html>
然后我继续创建了一个扩展Base
的附加类,这是我遇到问题的地方..
require "class.base.php";
class ExampleTwo extends Base
{
public function __construct()
{
$this->test("example two");
}
}
当我尝试创建此类的实例,或者甚至只是使用require
来访问该类时,我收到错误:
致命错误:无法重新声明类Base 第3行的C:\ xampp \ htdocs \ testing \ class.base.php
所以可以肯定的是,这个错误是非常自我解释的,因为我在每个类的顶部使用了require "class.base.php";
- 这是你在ActionScript 3中所做的,因为我正在使用基类(扩展它。)
我想我发现很难理解我应该怎么做。我应该将require
放在Base
的哪个位置?在我扩展的后一类中省略它似乎很奇怪,因为如果我不创建我的第一个类的实例,那么基类就不会被包含在内。
任何建议都很棒!
答案 0 :(得分:6)
您可以使用require_once()
声明。它的功能与require语句类似,但会检查以确保尚未包含基类,并在需要时加载它。
http://php.net/manual/en/function.require-once.php
您可能还希望根据网站的大小调查Web框架,但这不在问题范围内:)
答案 1 :(得分:2)
您应该了解spl_autoload_register的工作原理。它会以更可重复的方式解决您的问题。
此外,您应该停止在__construct
方法中“工作”。仅用于分配。如果您的Website
类需要数据库连接,那么您应该创建一个PDO(或mysqli?)对象,并将其传递给构造函数中的实例。
P.S。观看"Clean Code Talks - Unit Testing",实际上强烈建议其他系列讲座。
答案 2 :(得分:1)
您需要使用require_once
代替require
。这样,PHP只会包含该文件,如果还没有这样做的话。
答案 3 :(得分:1)
您应该使用require_once
答案 4 :(得分:1)
如果您只想破解上述问题,请使用require_once
。
但就像egis所说的那样,自动加载器要好得多,因为它根据需要包含你的类。使您免于手动包括很多地方的课程。如果你的班级依赖于其他许多课程怎么办?
答案 5 :(得分:1)
如果你甚至不想关心,你应该使用__autoload并让php为你做所有繁重的工作。