参见英文答案 >
Reference – What does this error mean in PHP?31个
在这里得到一个非常奇怪的错误,我正在写一个flatfile数据库类,这一切都正常,直到我刷新,现在我不断得到这个消息:
在这里得到一个非常奇怪的错误,我正在写一个flatfile数据库类,这一切都正常,直到我刷新,现在我不断得到这个消息:
Fatal error: Call to a member function name() on a non-object in
/home/reithg/public_html/test/engine/class.database.PHP on line 50
我打电话给班级如下:
<?PHP ini_set('display_errors','1'); require('engine/class.database.PHP'); $config = new Config("lessons",array('first','second','third','fourth'),"data/"); $db = new Database($config,true); print("Querying DB for 'theta' no exclusions: <br />"); print_r($db->query('theta',NULL,NULL)); print("<p /> Querying DB for 'theta' in column 'second': <br />"); print_r($db->query('theta',NULL)); print("<p /> Querying DB for first two rows: <br />"); print_r($db->getRows(2)); print("<p /> Querying DB for last three rows: <br />"); print_r($db->getRows(3,true)); print("<p /> Cleaning data for safe DB input: <br />"); $testInput = array('escape|these||delimiters','and\these\\slashes','and\0these\0nulls',"don't,forget quotes"); print("input: "); print_r($testInput); echo("<br />output: "); print($db->addRow($testInput)); ?>
这是我的class.database.PHP
<?PHP require('class.config.PHP'); require('class.column.PHP'); class Database { private $_config,$_pointer; public function __construct(Config $config) { $this->_config = $config; return true; } private function connect($method) { if (!($this->_pointer = @fopen($this->_config->db(),$method))) echo("Unable to connect to database"); } private function disconnect() { fclose($this->_pointer); } private function lock($method) { if(flock($this->_pointer,$method)) return true; return false; } private function unlock() { flock($this->_pointer,LOCK_UN); } private function cleanInput($input) { $data = array_map(array($this,'escapeData'),$input); $output = implode($this->_config->delimiter(),$data)."\r\n"; return $output; } private function escapeData($data) { $search = array('\\','"',"'",'\\0','\n',$this->_config->delimiter()); $replace = array('\\\\','\"',"\'",'\\n','\\'.$this->_config->delimiter()); $output = str_replace(array_unique($search),array_unique($replace),$data); return $output; } private function formatRow($data) { foreach($data as $key => $value) { $row[$this->_config->columns($key,"position")->name()] = $value; } return $row; } public function dumpToArray() { $arrayDump; foreach(file($this->_config->db(),FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $row => $content) $arrayDump[$row] = formatRow(explode($this->_config->delimiter(),$content)); return $arrayDump; } public function addRow(array $data) { $this->connect('ab'); if($this->lock(LOCK_EX)) { // fwrite($this->_pointer,$this->cleanInput($data)); echo($this->cleanInput($data)); $this->unlock(); $this->disconnect(); return true; } else { $this->disconnect(); return false; } } public function query($value,$column = NULL,$limit = NULL) { $this->connect('rb'); $results = array(); while ((is_null($limit) || (count($results) < $limit)) && !feof($this->_pointer)) { $data = explode($this->_config->delimiter(),fgets($this->_pointer,1024)); if(!is_null($column)) { if ($data[$this->_config->columns($column,"string")->index()] == $value) array_push($results,$this->formatRow($data)); } else { if (in_array($value,$data)) array_push($results,$this->formatRow($data)); } } $this->disconnect(); switch (count($results)) { case 0; return false; case 1; return $results[0]; default; return $results; } } public function getRows($limit = 1,$reverse = false) { $this->connect('rb'); $offset = 0; $results = array(); if ($reverse) { while(count($results) < $limit && fseek($this->_pointer,$offset,SEEK_END) >= 0) { $char = fgetc($this->_pointer); if($char == "\n" || $char == "\r"){ $offset --; $data = explode($this->_config->delimiter(),1024)); array_push($results,$this->formatRow($data)); } $offset--; } $results = array_reverse($results); } else { while ((($limit === NULL) || (count($results) < $limit)) && !feof($this->_pointer)) { $data = explode($this->_config->delimiter(),1024)); array_push($results,$this->formatRow($data)); } } $this->disconnect(); return $results; } } ?>
class.config.PHP
<?PHP class Config { private $_db,$_file,$_columns = array(),$_directory,$_delimiter; public function __construct($file,array $columns,$directory = NULL,$delimiter = "|") { $this->_db = $directory.$file.".db"; $this->defineColumns($columns); $this->_directory = $directory; $this->_delimiter = $delimiter; } public function db() { return $this->_db; } public function delimiter() { return $this->_delimiter; } private function defineColumns($constants) { for ($i=0;$i<count($constants);$i++) { if(in_array($constants[$i],$this->_columns)) die("Column names must be unique"); $column = new Column($constants[$i],$i); $this->_columns[$column->name()] = $column; } } public function columns($index,$search = "string") { switch ($search) { case "string"; return $this->_columns[$index]; break; case "position"; $keys = array_keys($this->_columns); return $this->_columns[$keys[$index]]; break; default; return false; } } } ?>
class.column.PHP
<?PHP class Column { const ALL = "0",STRING = "1",NUMBER = "2",INT = "3",AUTO_INCREMENT = "4",CURRENT_TIME = "5"; private $_type = ALL,$_name,$_index,$_maxChars = "256"; public function __construct($name,$index,$type = NULL,$maxChars = NULL) { $this->_name = $name; $this->_index = $index; if(!is_null($type)) setDataType($type); if(!is_null($maxChars)) setMaxChars($maxChars); return $this; } public function setDataType($type) { switch ($type) { case ALL; case STRING; case NUMBER; case INT; case AUTO_INCREMENT; case CURRENT_TIME; $this->_type = $type; break; default; return false; } } public function auditData($data) { switch ($this->_type) { case ALL; $output = $data; break; case STRING; $output = (string) $data; break; case NUMBER; $output = (float) $data; break; case INT; $output = (int) $data; break; case AUTO_INCREMENT; $output = (int) $data; break; case CURRENT_TIME; $output = time(); break; default; return false; } return $output; } public function setMaxChars($maxChars) { if(is_int($maxChars)) { $this->_maxChars = $maxChars; } } public function name() { return $this->_name; } public function index() { return $this->_index; } } ?>
我知道这是很多代码,但我无法理解为什么会突然发生这种情况,字面意思是在一次刷新时没有对代码进行任何更改.即使我回溯到早期版本,这也正在发生.
当我尝试做:
print($this->_config->columns($key,"position"));
它返回:
Catchable fatal error: Object of class Column could not be converted
to string in /home/reithg/public_html/test/engine/class.database.PHP
*on line 50*
这表明我在类Column的成员上执行name(),该类具有名为name()的公共方法
当我做:
print($this->_config->columns($key,"position")->name());
它返回(每次一个单词,因为它在foreach循环中);
first second third fourth first second third fourth
所以它显然在它之前工作了1行.