如何在for循环中创建类(对象)的实例?

时间:2019-02-15 21:36:22

标签: php

我包括类定义并在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”。

3 个答案:

答案 0 :(得分:2)

正如其他人所指出的,您在混淆几件事:

  • 包括具有includeinclude_oncerequirerequire_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中的类。