मैं PHP OOP के बारे में अधिक जानने की तलाश में एक नौसिखिया हूं, इसलिए ऐसी चीजें हैं जो मुझे नहीं पता हैं, ShowUsers() विधि में, मैं डेटाबेस में सभी उपयोगकर्ताओं को प्रदर्शित करना चाहता हूं, लेकिन मुझे यह नहीं मिल रहा है , क्योंकि मुझे नहीं पता कि कनेक्शन संपत्ति को कैसे कॉल करें।

अगर मैं इनकैप्सुलेशन का उपयोग कर रहा हूं, तो यह आसान होगा, लेकिन मैं स्थानीय के रूप में कनेक्शन संपत्ति का उपयोग कर रहा हूं, और मैं वास्तव में नहीं जानता कि इस संपत्ति को कैसे कॉल किया जाए, मैं इसे कैसे कॉल कर सकता हूं इनकैप्सुलेशन का उपयोग किए बिना?

db.php

<?php


class DbConnect {
    private $host = 'localhost';
    private $dbname = 'database';
    private $username = 'root';
    private $password = '';

    public function __construct() {
        try {
            $conn = new PDO("mysql:host=$this->host;dbname=$this->dbname", $this->username, $this->password);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch(PDOException $exception) {
            throw new Exception($exception->getMessage());
        }
    }
} 

main.php

<?php

require_once 'db.php';

class Main extends DbConnect {

    public function __construct() {
        parent::__construct();
    }

    public function ShowUsers() {
        $sql = "SELECT * FROM users";
        $result = parent::__construct()->prepare($sql); //Problem here
        $result->execute();
    }
}

$object = new Main();
$object->ShowUsers();

नोट: मैं इसे काम करने के लिए एनकैप्सुलेशन का उपयोग नहीं करना चाहता, मैं सीखना चाहता हूं कि यदि संभव हो तो एनकैप्सुलेशन का उपयोग किए बिना वेरिएबल को कैसे कॉल करें।

php
0
user14929188 12 फरवरी 2021, 22:36
3
आप किस संपत्ति को पाने की कोशिश कर रहे हैं? ऊपर दिए गए उदाहरण में, पैरेंट क्लास में, आपने $conn किसी भी चीज़ को असाइन नहीं किया है, इसलिए उपवर्ग के पास इसे एक्सेस करने का कोई तरीका नहीं है।
 – 
Kit Peters
12 फरवरी 2021, 22:41
2
साथ ही, यदि आप कक्षा का विस्तार करते हैं तो आपको अपने माता-पिता को कॉल करने के लिए कोई फ़ंक्शन लिखने की ज़रूरत नहीं है, यह प्रति विरासत में किया जाएगा। तो Main के निर्माण का कोई मतलब नहीं है।
 – 
β.εηοιτ.βε
12 फरवरी 2021, 22:42
@β.εηοιτ.βε हम्म, यह सच है!
 – 
user14929188
12 फरवरी 2021, 22:45
मैंने संपत्ति बनाई, कन्स्ट्रक्टर विधि काम कर रही है और डेटाबेस से जुड़ती है। लेकिन मुझे नहीं पता कि ShowUsers() विधि में इस संपत्ति का उपयोग कैसे करें और क्वेरी को निष्पादित करें।
 – 
user14929188
12 फरवरी 2021, 22:46
3
मैं आपके द्वारा पोस्ट किए गए कोड को देख रहा हूं। मैं देखता हूं कि $conn को __construct() में स्थानीय चर के रूप में बनाया गया है, लेकिन किसी ऑब्जेक्ट प्रॉपर्टी को कभी असाइन नहीं किया गया है। जब तक इसे किसी ऑब्जेक्ट प्रॉपर्टी (जैसे protected $conn) को असाइन नहीं किया जाता है, तब तक यह उस try/catch ब्लॉक के बाहर पहुंच योग्य नहीं होगा, जिसमें आपने इसे घोषित किया है।
 – 
Kit Peters
12 फरवरी 2021, 22:59

1 उत्तर

सबसे बढ़िया उत्तर

ऊपर दिए गए कोड और टिप्पणियों के आधार पर, मेरा सुझाव है कि आप $conn को अपनी DbConnect कक्षा में सुरक्षित घोषित करें:

<?php
// db.php  

class DbConnect {
    private $host = 'localhost';
    private $dbname = 'database';
    private $username = 'root';
    private $password = '';
    protected $conn;
    public function __construct() {
        try {
            $this->conn = new PDO("mysql:host=$this->host;dbname=$this->dbname", $this->username, $this->password);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch(PDOException $exception) {
            throw new Exception($exception->getMessage());
        }
    }
} 

फिर main.php में, आप यह कर सकते हैं:

<?php
// main.php

require_once 'db.php';

class Main extends DbConnect {

    public function __construct() {
        parent::__construct();
    }

    public function ShowUsers() {
        $sql = "SELECT * FROM users";
        $result = $this->conn->prepare($sql);
        $result->execute();
    }
}

$object = new Main();
$object->ShowUsers();
?>
1
Kit Peters 12 फरवरी 2021, 23:03
1
आप सभी के समर्थन के लिए बहुत-बहुत धन्यवाद
 – 
user14929188
12 फरवरी 2021, 23:06
2
जैसा कि β.εηοιτ.βε ने ऊपर उनकी टिप्पणी में देखा, आपको construct अंदर Main वर्ग की आवश्यकता नहीं है।
 – 
AbsoluteBeginner
12 फरवरी 2021, 23:10
1
समझा। आप लोगों को धन्यवाद
 – 
user14929188
12 फरवरी 2021, 23:23
1
जानकारी के पूरक के रूप में, stackoverflow.com/a/1020776/2123530
 – 
β.εηοιτ.βε
12 फरवरी 2021, 23:24
1
@β.εηοιτ.βε बहुत बहुत धन्यवाद
 – 
user14929188
12 फरवरी 2021, 23:25