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

我打电话给班级如下:

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

答案是由于lessons.db文件中隐藏的字符.

显示错误与此无关,我要感谢所有花时间给他们两便士的人.

猜你在找的PHP相关文章