我包括类定义并在for循环内创建对象。 如果使用include_once(class_file.php),则在循环的第二次运行中,我得到的结果与第一次循环中的结果完全相同。 如果我使用include(class_file.php),则会收到错误消息“无法声明类,因为该名称已在其中使用”。
我试图在第二次迭代之前使用unset()清除对象,但这没有帮助。
我可以/应该在循环中包含对象吗? 什么是合适的解决方案?
//run.php
$nominals = array("HFG", "LKD");
for ($x=0; $x<count($nominals); $x++) {
if ( $nominals[$x] == "HFG" ) {
$login = "mark";
$pass = "abc";
$nom = "HFG";
$num = 8495876;
} else if ($nominals[$x] == "LKD") {
$login = "john";
$pass = "gfd";
$nom = "LKD";
$num = 9384757;
} else {
exit();
}
include_once("class_Funding.php");
include('GET_funding_scrape.php');
}
如果for循环内的条件确定了login,pass,nom和num的值。以后使用的是包含的php文件。
如果我在循环之外包含类,则会收到错误消息,指出未定义login,pass,nom和num。
也许我应该使用案例吗?
以上文件run.php启动整个脚本。
//class_Funding.php
class DataInfo {
protected $login;
protected $pass;
protected $nom;
public function __construct($login, $pass, $nom) {
$this->login = $login;
$this->pass = $pass;
$this->nominal = $nominal;
}
public function go() {
if ($this->login == "mark") {
return "111111";
} else if ($this->login == "john") {
return "222222";
} else {
return "err";
}
}
}
$object = new DataInfo($login, $pass, $nom);
以上文件class_Funding.php包含类定义并启动$ object。
//GET_funding_scrape.php
$new[] = $object->go();
print_r($new);
enter code here
unset($new);
以上文件GET_funding_scrape.php从class_Funding.php获取数据并将其广告并排列并打印出
我的期望是,在第一次迭代时,我得到“ 111111”,第二次得到“ 222222”。但是我每次都会收到“ 111111”。
答案 0 :(得分:2)
正如其他人所指出的,您在混淆几件事:
include
,include_once
,require
或require_once
的文件。这只是破坏代码以使其易于管理的一种方法。任何PHP代码都可以在包含的文件中,但通常会包含函数和类的定义,只需定义一次即可。class Foo { ... }
定义一个类。这为您要在代码中使用的特定类型的对象命名。每个类只能声明一次;然后将其定义保持到脚本结尾。new Foo
创建对象。这将创建您先前定义的类的新“实例”。每个实例都是独立的,可以像其他任何变量一样在程序中传递。您应该在循环中重复的唯一部分是创建对象:每次类定义都是相同的,并且所包含的文件应仅包含该定义并加载一次。
>答案 1 :(得分:2)
好的,所以您的问题是您多次声明了该类。声明就像
class myClass {
// Code...
// etc.
};
您只能使用php(或实际上任何一种语言,但现在只谈论php)一次。 但是,您可以多次执行的操作是这样多次实例化该类:
$obj1 = new myClass();
$obj2 = new myClass();
// etc.
这会根据您在class
声明中定义的规范创建一种数据类型。
建议的解决方案:将$object = new DataInfo($login, $pass, $nom);
行移至要包含的文件之外,而仅将这一行放入循环中。然后将include移到循环之外。
示例:
//run.php
$nominals = array("HFG", "LKD");
// declare the class only once:
include_once("class_Funding.php");
for ($x=0; $x<count($nominals); $x++) {
if ( $nominals[$x] == "HFG" ) {
$login = "mark";
$pass = "abc";
$nom = "HFG";
$num = 8495876;
} else if ($nominals[$x] == "LKD") {
$login = "john";
$pass = "gfd";
$nom = "LKD";
$num = 9384757;
} else {
exit();
}
$object = new DataInfo($login, $pass, $nom);
include('GET_funding_scrape.php');
}
//class_Funding.php
class DataInfo {
protected $login;
protected $pass;
protected $nom;
public function __construct($login, $pass, $nom) {
$this->login = $login;
$this->pass = $pass;
$this->nominal = $nominal;
}
public function go() {
if ($this->login == "mark") {
return "111111";
} else if ($this->login == "john") {
return "222222";
} else {
return "err";
}
}
}
// Comment this out or delete it
// $object = new DataInfo($login, $pass, $nom);
答案 2 :(得分:1)
仅在循环外包含一次类文件。将其包含在其中并检查(include_once)是否每次都包含是没有意义的。
如果在循环外包含文件时出现错误,即变量未定义,则您的类有问题。一个类不应依赖于其外部的变量声明。
包含文件和创建类的实例是不同的事情。
您可以在the php manual中了解php中的类。