在PHP中访问局部变量

时间:2019-03-22 06:07:22

标签: php oop

我有此代码:

class database{
    var $conn;
    function connect($server,$host_username,$host_password,$host_database){
        $server = 'localhost';
        $host_username = 'root';
        $host_password = '';
        $host_database = 'e-vent system db';

        $conn= new mysqli($server,$host_username,$host_password,$host_database);

        if ($conn->connect_error){
            die("db connection error:". $conn->connect_error);
        }
    }

    function read_db($table,$condition){
        $read="SELECT * FROM ".$table." ".$condition;
        $read_result=$conn->query($read);
        if(!$read_result){
            echo "select error:". mysqli_error($conn);
        }
        return $result;
    }
}

我收到此错误:

  

注意:未定义的变量:第19行的C:\ xampp \ htdocs \ E-vent \ database.php中的conn

如何使$conn函数可见read_db变量?

4 个答案:

答案 0 :(得分:3)

更改此行:

if ($conn->connect_error){

if ($this->conn->connect_error){

表示替换全部:

$conn->query

$this->conn->query

说明::如果要在整个类范围内使用变量,则必须使用类变量而不是局部(函数)范围变量。在这一行:

$conn->connect_error

$conn是一个局部变量,其作用域仅限于该函数,但是当您使用$this->conn时,这意味着您引用的是该类的所有成员函数均可访问的类变量。班级。

并将connect函数的所有内容放入类构造函数中,以便在类初始化时初始化此连接。 (感谢@Magnus指出这一点)

看看variable scope,它将帮助您理解概念。

答案 1 :(得分:1)

您正在将类变量用于函数中,oops的基本规则是要使用类变量,我们必须使用object访问它。因此可以使用$this在同一类下使用类变量。

因此您的代码必须是:

$this->$conn->connect_error

代替

$conn->connect_error

答案 2 :(得分:0)

您需要使用$this-特别是$this->conn,使连接对象成为类的属性。将您的连接对象分配给该属性。然后,您需要在该类中的其他所有地方引用$this->conn,而不是使用$conn

class database {
    public $conn;

    public function connect($server, $host_username, $host_password, $host_database)
    {
        $server = 'localhost';
        $host_username = 'root';
        $host_password = '';
        $host_database = 'e-vent system db';

        $this->conn = new mysqli($server, $host_username, $host_password, $host_database);

        if ($this->conn->connect_error) {
            die("db connection error:". $this->conn->connect_error);
        }
    }

    public function read_db($table, $condition)
    {
        $read = "SELECT * FROM ".$table." ".$condition;
        $read_result = $this->conn->query($read);
        if (!$read_result) {
            echo "select error:". mysqli_error($this->conn);
        }
        return $result;
    }
}

话虽这么说,但要注意几件事

  1. 您没有使用参数化查询,而是直接将变量注入查询中-这不安全,您应该使用带占位符的预处理语句。
  2. connect()方法接受所有参数,但是您仍然可以在函数中覆盖它们。替代方法是删除参数,删除硬编码值或在参数为空的情况下使用硬编码值。
  3. 在生产中,您不应将错误返回给用户。在开发过程中,这很好-但是在生产中,请将它们隐藏起来,记录下来并向用户显示通用的内容(例如500页或其他错误页面)。
  4. 您应该指定属性和方法是 public 受保护的静态还是私有。 li>

答案 3 :(得分:0)

最好使用公共访问修饰符而不使用var。 What does PHP keyword 'var' do?

Class属性必须定义为public,private或protected。如果使用var声明,则该属性将定义为public。

并且出于兼容性原因,仍支持使用var关键字声明变量的PHP 4方法(作为public关键字的同义词)。在PHP 5 5.1.3之前的版本中,其用法将生成E_STRICT警告。

PHP变量-http://php.net/manual/en/language.variables.variable.php

需要进行以下更改

class database{
    public $conn

还有这里

$this->conn= new mysqli($server,$host_username,$host_password,$host_database);

还有这里

if ($this->conn->connect_error){
    die("db connection error:". $this->conn->connect_error);
}

这里也是

$read_result=$this->conn->query($read);