参见英文答案 >
Reference – What does this error mean in PHP?31个
在这里得到一个非常奇怪的错误,我正在写一个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
我打电话给班级如下:
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:
");
print_r($db->query('theta',NULL,NULL));
print("
");
print_r($db->query('theta',NULL));
print("
");
print_r($db->getRows(2));
print("
");
print_r($db->getRows(3,true));
print("
");
$testInput = array('escape|these||delimiters','and\these\\slashes','and\0these\0nulls',"don't,forget quotes");
print("input: ");
print_r($testInput);
echo("
output: ");
print($db->addRow($testInput));
?>
这是我的class.database.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
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
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
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行.