功能

时间:2018-03-08 07:23:28

标签: php function class

当我创建对象SearchResult时,我有构造函数调用'setStandardsTable'函数来设置变量'standardsTable'。出于某种原因,我收到了错误

  

致命错误:未捕获错误:调用未定义的函数   setStandardsTable()...

  

错误:调用未定义的函数setStandardsTable()...

我尝试在每个变量声明后返回值,但仍然没有。以下是我的代码。

class SearchResult {

    private  $keyword, $standardsTable;

    /*Constructor */
    public function __construct($subject, $keyword) {

      //selects the standards table to query based on subject selected
      $this->standardsTable = setStandardsTable($subject);   

      //sets the keyword that will be used to search in the Standards table selected   
      $this->keyword = $keyword;                    
    }

    private function setStandardsTable($subj) {
      $standardsSelected="";

      switch($subj) {
        case "General Math":
          $standardsSelected = "math_standards_eng";
          break;
        case "Algebra I":
          $standardsSelected ="algebra_standards_eng";
          break;
        case "Algebra II":
          $standardsSelected = "algebra_two_standards_eng";
          break;
        default:
          $standardsSelected = "math_standards_eng";          
      }

      return $standardsSelected;
    }
}

4 个答案:

答案 0 :(得分:2)

在PHP中,您需要使用self::$this->来调用同一类中的函数:

调用静态函数:

$variable = self::SomeStaticFunction();

调用非静态函数:

$variable = $this->FunctionThatIsntStatic();

...而不仅仅是函数名,它应该在全局名称空间中。

$this->standardsTable = SomeFunction();

在您的情况下:这是$this->setStandardsTable($subject);

答案 1 :(得分:0)

您似乎只需要做一个小改动就可以替换

$this->standardsTable = setStandardsTable($subject);

$this->standardsTable = $this->setStandardsTable($subject); 

答案 2 :(得分:0)

你不能直接调用Class的成员函数,你应该指定对象来调用成员函数。 您只需使用 $ this-> setStandardsTable($ subject)

答案 3 :(得分:0)

正如其他人所提到的,你必须用$this

来称呼它
$this->standardsTable = $this->setStandardsTable($subject); 

那说其他人没有提到我认为将会有很大的好处,而是使用工厂方法。因此,不是一个压倒性的课程,你会做很多。

interface SearchResultInterface{
     public function setKeyword($keyword);    
     public function getKeyword();
     public function getTable();
}

abstract AbstractSearchResult impliments SearchResultInterface{

    protected $keyword;

    public function setKeyword($keyword)
    {
        $this->keyword = $keyword;
    }     
    public function getKeyword(){
        return $this->keyword;
    }

    abstract function getTable();
}

class MathResults extends AbstractSearchResult{
    public function getTable(){
        return 'math_standards_eng';
    }
}


class SearchResultFactory {
    static function createResult($subj, $keyword) {
        switch($subj) {
            case "Algebra I":
               $Result = new AlgebraResults();
            break;
            case "Algebra II":
                $Result = new AlgebraIIResults();
            break;
            case "General Math":
            default:
                $Result = new MathResults();         
        }

        $Result->setKeyword( $keyword );
        return $Result;
    }
}

现在这里真正的优势在于它们看起来会包含较小的类功能。因此,例如AlgebraII可能包含来自代数的东西,其中可能包含来自Math的东西。

所以当你在:

中添加这些其他类时
class AlgebraResults extends MathResults{
    public function getTable(){
        return 'algebra_standards_eng';
    }
}

class AlgebraIIResults extends AlgebraResults{
    public function getTable(){
        return 'algebra_two_standards_eng';
    }
}

或者你可以像我一样扩展AbstractSearchResult而不是它之上的等级。

在我的用例中,这是否有意义,我不知道。但是如果你需要一些功能,那么可能会更加精简一些。

那就是说,不要为了打破他们而分手。如果功能通常相同且代码库很小,则可能不需要。但是如果你发现自己编写的代数和数学的编码方式大不相同,那么将它们分开可能是有意义的。

你从中获得的主要优势是更小的更集中的类/文件(每个类应该在它自己的文件中)。稍后添加内容会更容易,例如,如果添加微积分,则只需添加新类,而不必编辑现有代码。等

希望这是有道理的。