Расширение класса 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.
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;
}
}
Вам следует написать $user = новый администратор(), если вы хотите вызвать adm_getUsers(). И вам придется создать метод _constuct() в классе администратора, который будет вызывать parent::_construct($val).
Когда вы расширяете класс, вы фактически получаете доступ к свойствам и методам родительского класса, НЕ ВЫПОЛНЯЯ ИХ. Поэтому, если вы хотите получить доступ к некоторым данным из какого-либо метода в родительском классе, вы должны выполнить этот конкретный метод в родительском классе, а затем получить к нему доступ.
Например:
<?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();