当我创建对象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;
}
}
答案 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
而不是它之上的等级。
在我的用例中,这是否有意义,我不知道。但是如果你需要一些功能,那么可能会更加精简一些。
那就是说,不要为了打破他们而分手。如果功能通常相同且代码库很小,则可能不需要。但是如果你发现自己编写的代数和数学的编码方式大不相同,那么将它们分开可能是有意义的。
你从中获得的主要优势是更小的更集中的类/文件(每个类应该在它自己的文件中)。稍后添加内容会更容易,例如,如果添加微积分,则只需添加新类,而不必编辑现有代码。等
希望这是有道理的。