【问题标题】:How can I make an array of type "class" in PHP?如何在 PHP 中创建“类”类型的数组?
【发布时间】:2014-10-22 09:37:57
【问题描述】:

我有以下类,它有几个属性和一个 PHP 方法(这是简化的代码)。

class Member{
    public $Name;
    public $Family;
    
    public function Fetch_Name(){
      for($i=0;$i<10;$i++){
        $this[$i]->$Name = I find the name using RegExp and return the value to be stored here;
        $this[$i]->Family = I find the family using RegExp and return the value to be stored here;
      }
    }//function
}//class

在函数 Fetch_Name() 中,我想使用 RegExp 查找文本文件中的所有名称和族,并将它们以数组的形式存储为对象的属性。但我不知道我应该如何定义成员的数组。这是合乎逻辑的还是我应该定义 StdClass 或二维数组而不是类?

我发现here 的讨论略有相似,但使用二维数组而不是使用类属性将数据存储在对象中。

我认为我的问题在于定义以下代码行。

$Member = new Member();
$Member->Fetch_name();

我定义的成员不是数组。如果我确实定义了它数组,它仍然不起作用。我这样做了

$Member[]= new Member();

但它给出了错误

致命错误:在非对象中调用成员函数 Fetch_name()

如果我给 $Member[0]= new Member() 那么我不知道如何在 Fetch_Name 函数中创建 $Member1 或 Member[2] 等等。我希望我的问题不是复杂和不合逻辑的。

在此先感谢

【问题讨论】:

  • 您可以用来自特定类的对象填充数组,但 PHP 中没有类型数组这样的东西。
  • 我需要你解释的。一个可以由类中的对象填充的数组。但我是股票。
  • 提供的答案非常好。我只是说你不能真正将数组锁定为只接受一种特定类型的对象。

标签: php arrays object


【解决方案1】:

Member 对象代表 一个 成员。您试图重载它以表示或处理许多成员,这实际上没有意义。最后,您将希望得到一个包含许多 Member 实例的数组,而不是相反:

$members = array();
for (...) {
    $members[] = new Member($name, $family);
}

很可能你真的不需要你的Member 类来任何事情;提取逻辑应该驻留在Member 类之外,可能在Extractor 类或类似的东西中。从外部看,您的代码应该如下所示:

$parser  = new TextFileParser('my_file.txt');
$members = $parser->extractMembers();

【讨论】:

  • 谢谢,但这里有一个问题。我不知道一开始有多少成员,$member[] 的长度取决于文本文件中名称的数量。那么,我该如何构建 for 循环呢?
  • 你很可能不想要for 循环。您的提取器类需要解析文件并确定有多少名称,并根据需要实例化尽可能多的Members。我无法告诉您如何编写解析器(这是您真正要问的),因为我不知道要求是什么。提出一个单独的问题。
【解决方案2】:

我认为你应该有两个类:

  • 第一个,Fetcher(或你喜欢的名字),你的函数。
  • 第二个,成员,具有名称和家庭属性。

获取您的文本不是会员的工作,这就是我要开设另一个课程的原因。

在你的函数中,做你的工作,在循环中,这样做:

for($i = 0; $i < 10; ++$i){
    $member = new Member();
    $member->setName($name);
    $member->setFamily($family);
    // The following is an example, do what you want with the generated Member
    $this->members[$i] = $member;
}

【讨论】:

    【解决方案3】:

    这里的问题是您没有正确使用 Member 类型的对象作为数组。您的代码的正确格式是:

    class Member{
        public $Name;
        public $Family;
    
        public function Fetch_Name(){
          for($i=0;$i<10;$i++){
            $this->Name[$i] = 'I find the name using RegExp and return the value to be stored here';
            $this->Family[$i] = 'I find the family using RegExp and return the value to be stored here';
          }
        }
    }
    

    首先,$this-&gt;Name 不是 $this-&gt;$Name,因为 Name 已经声明为成员变量,而 $this-&gt;Name[$i] 是正确的语法,因为 $this 引用当前对象,它不能像它本身一样转换为数组。数组必须包含在成员变量中。

    L.E: 我可能会补充一点,您没有根据 PHP 命名标准编写代码。这不会影响您的功能,但以标准方式编写代码是一种很好的做法。毕竟,有一个标准是有目的的。

    Here你有一个如何做到这一点的指南。

    我会这样写你的代码:

    class Member{
        public $name;
        public $family;
    
        public function fetchName(){
          for($i=0;$i<10;$i++){
            $this->name[$i] = 'I find the name using RegExp and return the value to be stored here';
            $this->family[$i] = 'I find the family using RegExp and return the value to be stored here';
          }
        }
    }
    

    L.E2:看到你上面的评论,我会修改我的答案:

    所以你说你有一个对象,在调用之后,它的值必须存储到一个数组中。嗯,after 是这里的关键词:

    1. 初始化您的对象变量: $member = new Memeber(); $memebr->fechNames();

    2. 在foreach中初始化和数组

      $Member = new Member();
      
      foreach ($Member->Name as $member_name){
          $array['names'][] = $member_name;
      }
      
      foreach ($Member->Family as $member_family) {
          $array['family'][] = $member_family;
      }
      var_dump($array);
      

    这是你想要的更多吗?

    希望对您有所帮助!
    继续编码!
    战神。

    【讨论】:

    • Tnx Ares,不过你说的是一个属性是数组的类吧?
    • 是的。对象被创建,您可以在同一属性中保存许多结果。我虽然这是你想要的 :) 测试它,如果没有,请更明确,这样我可以更好地帮助你:D
    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多