Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP实现OOP。有些困惑_Php_Oop - Fatal编程技术网

用PHP实现OOP。有些困惑

用PHP实现OOP。有些困惑,php,oop,Php,Oop,我在本文中遵循了OOP 在我开始为对象使用占位符变量之前,似乎还可以: php > require('class_lib.php'); php > $test = new Db(); 我使用交互式PHP,因为逐行测试代码似乎更容易。 这一行似乎是问题所在: php > $result = $test->query("SELECT * FROM test"); PHP Fatal error: Call to a member function query() on a

我在本文中遵循了OOP

在我开始为对象使用占位符变量之前,似乎还可以:

php > require('class_lib.php');
php > $test = new Db();
我使用交互式PHP,因为逐行测试代码似乎更容易。 这一行似乎是问题所在:

php > $result = $test->query("SELECT * FROM test");
PHP Fatal error:  Call to a member function query() on a non-object in class_lib.php on line 23
这是OOP代码:

<?php 
        class Db {
                protected static $connection;

                public function connect(){
                        if (!isset(self::$connection)){
                                $configfile = realpath("database.ini");
                                echo $configfile . PHP_EOL;
                                $config = parse_ini_file($configfile);
                                $connection = mysqli_connect($config['host'],$config['user'],$config['password'],$config['dbname'],$config['port']);
                        }

                        if (self::$connection === false){
                                die ("Database connection failed.");
                                return mysql_errno(self::$connection);
                        }

                        return self::$connection;
                }

                public function query($query){
                        $connection = $this->connect();
                        $result = $connection->query($query);
                        return $result;
                }

                public function select_rows($query){
                        $rows = array();
                        $result = $this->query($query);
                        if ($result === false){
                                return false;
                        }

                        while ($result = $result->fetch_assoc()){
                                $rows[] = $row;
                        }

                        return $rows;
                }

                public function error(){
                        $connection = $this->connect();
                        return $connection->error;
                }

                public function quote($value){
                        $connection = $this->connect();
                        return "'" . $connection->real_escape_string($value) . "'";
                }

        }

非对象不是指
$test
。它指的是
DB->query()
方法中使用的
$connection
。该方法调用
$this->connect()
,但尽管connect方法返回
self::$connection
,但它实际上从未将其设置为任何值,因此它为null

我想这条线是应该设置的

$connection = mysqli_connect($config['host'],$config['user'],$config['password'],$config['dbname'],$config['port']);
但是,
$connection
只是函数范围中的一个局部变量。它不引用
self::$connection


它应该与
self::$connection=mysqli\u connect一起工作(…
相反。

该代码似乎是复制和粘贴尝试的失败结果。有两个
你的类库文件中有一个额外的开始标记。你应该得到一个语法错误。我建议你打开错误报告。啊。谢谢。显然我错过了。剪切和粘贴错误在这里,而不是在我系统的代码中。因此作者的code是错误的。我需要一段时间才能完全理解PHP的OOP实现的特性。是的。老实说,我会寻找一个不同的教程。一个使用准备好的语句的教程。字符串转义不足以阻止SQL注入。好的。你的最后一行完成了这个想法。对教程有什么建议吗?我已经在阅读关于准备语句的教程。不太关心将所有内容放在一个地方。是的。在函数范围内,引用类变量的唯一方法是
$this->variable
,或者
self::$variable
用于静态变量。只需使用
$variable
就可以创建一个新变量,限制在该变量的范围内行动。