Расширение класса PHP


У меня проблема с пониманием того, как работает расширение класса..

Я пытаюсь расширить класс, чтобы разделить функции в разных файлах, чтобы сделать его более организованным..

Но у меня проблемы с доступом к переменным и функциям основного класса в дочернем классе.

Вот что у меня есть:

Родительский класс: это класс uFlex v 0,88 Я не пишу все это, потому что это долго..

class uFlex {
    //Constants
    const version = 0.88;
    const salt = "";
    //End of constants\\\\
    /**
     * PDO / database credentials
     */
    var $db = array(
        "host" => '',
        "user" => '',
        "pass" => '',
        "name" => '',   //Database name
        "dsn" => '' //Alterntive PDO DSN string
    );

        function connect(){
        if(is_object($this->db)) return true;

        /* Connect to an ODBC database using driver invocation */
        $user = $this->db['user'];
        $pass = $this->db['pass'];
        $host = $this->db['host'];
        $name = $this->db['name'];
        $dsn = $this->db['dsn'];

        if(!$dsn){
            $dsn = "mysql:dbname={$name};host={$host}";
        }

        $this->report("Connecting to database...");

        try{
            $this->db = new PDO($dsn, $user, $pass);
            $this->report("Connected to database.");
        }catch(PDOException $e){
            $this->error("Failed to connect to database, [SQLSTATE] " . $e->getCode());
        }

        if(is_object($this->db)) return true;
        return false;
    }
}

Затем:

<?php
class admin extends uFlex {

    function adm_getUsers(){
            if(!$this->connect()) return false;

            $sql= "SELECT * from users LIMIT 30";
            $st = $this->db->prepare($sql);
        $out = $st->execute();
            $row = $st->fetchAll(PDO::FETCH_ASSOC);
            return $row;    
    }

    function adm_getSingleUser($id){
            if(!$this->connect()) return false;
        if(is_numeric($id)){
            $sql= "SELECT * from users WHERE id = '$id'";
            }else{
            $sql= "SELECT * from users WHERE username = '$id'";
            }
            $st = $this->db->prepare($sql);
        $out = $st->execute();
            $row = $st->fetch(PDO::FETCH_ASSOC);
            return $row;
    }
}

?>

Я инициализирую их в конфигурационном файле, который включаю в каждая страница:

$user = new uFlex(false);
$admin = new admin();

Но при использовании массива $admin->adm_getUsers(); $row он пуст.

Прежде чем попытаться разделить функции между 2 классами, я использовал ту же функцию в основном классе и работал.

Я впервые пытаюсь расширить класс.. я искал в Google, а также прочитал здесь несколько вопросов, но это слишком сложно для моего понимания, так как я все еще изучаю PHP.

Author: Fr0z3n, 2013-02-21

3 answers

Вот где наследование на самом деле не лучший ответ. Вместо этого вы можете отказаться от наследования и вместо этого использовать композицию. Передайте свой экземпляр uFlex как зависимость Admin следующим образом:

$user = new uFlex(false);
$admin = new Admin($user); // uFlex is being passed in

Сначала вам нужно будет обновить свой класс PHP, так как есть несколько изменений:

class Admin {

    // Added private variable that will hold the uFlex instance
    private $user;

    // Added a class constructor which will be called when we create a new Admin
    function __construct($user) { // Receives an instance of uFlex
        $this->user = $user;
    }

    function adm_getUsers(){
        if(!$this->user->connect()) return false; // Call connect on user
        $sql= "SELECT * from users LIMIT 30";
        $st = $this->user->db->prepare($sql); // Call prepare on db of user
        $out = $st->execute();
        $row = $st->fetchAll(PDO::FETCH_ASSOC);
        return $row;    
    }

    function adm_getSingleUser($id){
        if(!$this->user->connect()) return false; // Same here
        if(is_numeric($id)) {
            $sql= "SELECT * from users WHERE id = '$id'";
        } else {
            $sql= "SELECT * from users WHERE username = '$id'";
        }
        $st = $this->user->db->prepare($sql); // And here
        $out = $st->execute();
        $row = $st->fetch(PDO::FETCH_ASSOC);
        return $row;
    }
}
 7
Author: Stuart Wakefield, 2013-02-21 09:43:32

Вам следует написать $user = новый администратор(), если вы хотите вызвать adm_getUsers(). И вам придется создать метод _constuct() в классе администратора, который будет вызывать parent::_construct($val).

 0
Author: s0nicYouth, 2013-02-21 09:37:39

Когда вы расширяете класс, вы фактически получаете доступ к свойствам и методам родительского класса, НЕ ВЫПОЛНЯЯ ИХ. Поэтому, если вы хотите получить доступ к некоторым данным из какого-либо метода в родительском классе, вы должны выполнить этот конкретный метод в родительском классе, а затем получить к нему доступ.

Например:

<?php
class parent{

    public function adm_getUsers(){
        //your code to get users
    }
}

class child extends class parent{
    public $adm_getUsers = array();

    public function getUsers(){
        if(!isset($this->adm_getUsers)){
            $this->adm_getUsers = $this->adm_getUsers();
        }
        return $this->adm_getUsers;
    }
}

$childObj = new child();
$users = $childObj->getUsers();
 0
Author: Sid, 2013-02-21 09:46:32