【问题标题】:Error using function in a php class在 php 类中使用函数时出错
【发布时间】:2013-12-15 06:25:38
【问题描述】:

我正在尝试通过使用 PHP 中的函数来整理我的代码。我知道我的函数确实有效,但是当我在 PHP 中创建一个类来存储我的函数时,会出现错误

解析错误:语法错误,意外的“getsquad”(T_STRING),期待 第 18 行 C:\wamp\www\tutorials\squad.php 中的函数 (T_FUNCTION)。

第 18 行是我调用函数的地方。用于测试建议。

<?php
include 'simple_html_dom.php';

class squad{

    function getsquad($url){
        $html = file_get_html($url);
        foreach ($html->find('td[align=left]') as $element) {
           if ($element->children(0)) { // work only when children exists
               return $element->children(0)->innertext.'<br>';
           }
        }
    }

    getsquad('$site');

} 

?>

应该很简单,因为我对 PHP 还很陌生。

【问题讨论】:

  • 单引号和变量不在一起

标签: php function


【解决方案1】:

我将详细说明您的情况。让我们看看你的代码:

class squad {
    function getsquad($url){
        $html = file_get_html($url);
        foreach ($html->find('td[align=left]') as $element) {
           if ($element->children(0)) { // work only when children exists
               return $element->children(0)->innertext.'<br>';
           }
        }
    }
    getsquad('$site');
}

首先,你不能在类中声明任何逻辑,除非它在函数中。在函数之外你所能做的就是声明类将使用的属性。让我们跳过这一点,假设您已将其更改为如下内容:

$squad = new squad();
$get_squad = $squad->getsquad();

现在,您在 getsquad() 函数中使用的逻辑模式是 baaaad。在循环中返回?坏坏的尼克。通过查看此函数,我可以假设您正在执行的操作是遍历 HTML 文件,直到找到一个孩子,然后将其返回(函数结束)。这很酷,但你不应该这样做 - 任何人都会告诉你,你应该总是在函数的 endreturn

function getsquad($url){
    $html = file_get_html($url);
    foreach ($html->find('td[align=left]') as $element) {
       if ($element->children(0)) { // work only when children exists
           return $element->children(0)->innertext.'<br>';
       }
    }
}

所以你应该这样做:

function getsquad($url){
    $html = file_get_html($url);
    $found_child = null;
    foreach ($html->find('td[align=left]') as $element) {
       if ($element->children(0)) { // work only when children exists
           $found_child = $element->children(0)->innertext . '<br>';
           break; // break ends your foreach loop
       }
    }
    return $found_child;
}

此外,就良好的编码习惯而言,您不应该格式化来自 getsquad() 的任何数据 - 我知道这对于您正在做的事情来说似乎有点矫枉过正,但您应该这样做它:

function getsquad($url) {
    $html = file_get_html($url);
    $found_child = null;
    foreach ($html->find('td[align=left]') as $element) {
       if ($element->children(0)) { // work only when children exists
           $found_child = $element->children(0)->innertext;
           break; // break ends your foreach loop
       }
    }
    return $this->format_squad($found_child);
}

private function format_squad($found_child) {
    return $found_child . '<br>';
}

这样做会使您的数据和格式完全分开。它易于维护、读取和写入。

所以你的最终用法(注意你需要分配一个变量来存储你的函数的返回[从你的问题和答案中缺失]):

$squad = new squad();
// store it in a variable since it's returning data not outputting
$squad_info = $squad->getsquad($url);

【讨论】:

  • 优秀的编码技能,将尝试和练习有组织的编码
【解决方案2】:

你可以试试这个,

 $squad = new squad();
 $squad->getsquad($site);

你的代码:

<?php
include 'simple_html_dom.php';

class squad{

function getsquad($url){

$html = file_get_html($url);

  foreach($html->find('td[align=left]') as $element) {
      if ($element->children(0)) { // work only when children exists
          return $element->children(0)->innertext.'<br>';
      }
    }
  }
 } 


// You can use below steps to call the class inside function
$squad = new squad();
$squad->getsquad($site);

?>

【讨论】:

    【解决方案3】:

    您不能从类内部调用该方法。你需要加载类然后调用方法:

    <?php
    include 'simple_html_dom.php';
    
    $Squad = new squad();
    $Squad->getsquad($site);
    
    class squad{
    
        function getsquad($url){
            $html = file_get_html($url);
            foreach ($html->find('td[align=left]') as $element) {
               if ($element->children(0)) { // work only when children exists
                   return $element->children(0)->innertext.'<br>';
               }
            }
        }
    } 
    ?>
    

    【讨论】:

    • 是的,你可以,这就是$this-&gt;function() 的用途。这个怎么样:function __construct() { $this-&gt;getsquad(); }
    • 当然……但不是他试图这样做的方式。你看到了帖子。但如果你想分头,我想你是欢迎的。
    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多