簡體   English   中英

PHP oop如何以更簡單的方式調用另一個類方法?

[英]PHP oop how to call another class method in a easier way?

我是php OOP的新手。 我對自己的情況有疑問。

db.php中

class db{

protected $db_host;
protected $db_name;
protected $db_user_name;
protected $db_pass;

public function __construct() {
    $this->db_host="localhost";
    $this->db_name="bs";
    $this->db_user_name="root";
    $this->db_pass="";
}

public function conn(){

    try {   
        $conn = new PDO("mysql:host=$this->db_host;dbname=$this->db_name", $this->db_user_name="root", $this->db_pass);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $conn;
    }
    catch(PDOException $e)
        {
        echo $sql . "<br>" . $e->getMessage();
        }
    }
}

item.php

require "../../includes/db.php";

class item{

public $user_uid;
public $last_id;
public $display_item;
public $iid;

protected $item_id;
protected $item_name;
protected $item_price;
protected $item_quantity;

public function add_item($uid,$item_id,$item_n,$item_p,$item_q){

    $db = new db();
    $conn=$db->conn();

    $this->user_uid=$uid;
    $this->item_id=$item_id;
    $this->item_name=$item_n;
    $this->item_price=$item_p;
    $this->item_quantity=$item_q;

    try {
        $sql = "INSERT item(uid,item_id,item_name,item_price,item_quantity) 
                    VALUES('$this->user_uid','$this->item_id','$this->item_name','$this->item_price','$this->item_quantity')";
        $conn->exec($sql);
        $this->last_id=$conn->lastInsertId();
    }

    catch(PDOException $e){
        echo $sql . "<br>" . $e->getMessage();
    }
    $conn = null;
}

public function display_item($uid){

    $db = new db();
    $conn=$db->conn();

    $this->user_uid=$uid;

    try{

        $sql="SELECT * FROM item where uid='$this->user_uid'";
        $statement=$conn->query($sql);

        while($row=$statement->fetch()){

            $this->iid[]=$row['iid'];
            $this->display_item[]=[$row['item_id'],$row['item_name'],$row['item_price'],$row['item_quantity']];

        }

    }
    catch(PDOException $e){
        echo $sql . "<br>" . $e->getMessage();
    }
    $conn = null;
}
}

如您從item.php看到的,我必須打電話

$db = new db();
$conn=$db->conn();

在add_item()和display_item()中。

因此,這意味着我必須訪問數據庫連接的每種方法。 是否可以通過不修改代碼在其他類中不創建$ db = new db()來實現此目的呢?

要么

我是否錯過了PHP可以做到的一些功能?

我想要的方式

require "../../includes/db.php";
$db = new db();
$conn=$db->conn();

class item{

...
...

public function add_item($uid,$item_id,$item_n,$item_p,$item_q){
try {
    $sql = "INSERT item(uid,item_id,item_name,item_price,item_quantity) 
                VALUES('$this->user_uid','$this->item_id','$this->item_name','$this->item_price','$this->item_quantity')";
    $conn->exec($sql);
}

public function display_item($uid){

....

try{

        $sql="SELECT * FROM item where uid='$this->user_uid'";
        $statement=$conn->query($sql);

這樣我只聲明1次()

$db = new db();
$conn=$db->conn();

在類item()中,並將其用於其余方法。

只需在構造函數中添加連接即可。 還要添加必要的屬性:

class db
{

    protected $db_host;
    protected $db_name;
    protected $db_user_name;
    protected $db_pass;
    protected $db_conn; // add me here

然后在構造函數中,使用那里的憑據進行連接。 這樣,當您創建對象時,它已經連接了,您只需將屬性連接用於執行中的查詢和操作即可:

public function __construct() 
{
    $this->db_host = "localhost";
    $this->db_name = "bs";
    $this->db_user_name = "root";
    $this->db_pass = "";

    // connect
    try {   
        $this->db_conn = new PDO("mysql:host=$this->db_host;dbname=$this->db_name", $this->db_user_name="root", $this->db_pass);
        $this->db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->db_conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }
    catch(PDOException $e) {
        echo $sql . "<br>" . $e->getMessage();
        exit;
    }
}

然后,擴展item中的db類。 現在,您可以在item類中使用dbdb_conn屬性。

class item extends db
{

    public $user_uid;
    public $last_id;
    public $display_item;
    public $iid;

    protected $item_id;
    protected $item_name;
    protected $item_price;
    protected $item_quantity;


    public function display_item($uid)
    {
        try {

            $stmt = $this->db_conn->prepare('SELECT * FROM item WHERE uid = :uid');
            $stmt->bindValue(':uid', $uid);
            $stmt->execute();

            foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
                $this->iid[] = $row['iid'];
                $this->display_item[] = [$row['item_id'], $row['item_name'], $row['item_price'], $row['item_quantity']];
            }

        } catch(PDOException $e) {
            echo $e->getMessage();
            exit;
        }
    }
}

旁注:我在頂部添加了准備好的語句

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM