php 调用成员函数,PHP:致命错误:调用非对象上的成员函数

参见英文答案 >

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行.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值