Zasadniczo tworzę tylko dwie klasy, w których jedna klasa, w tym przypadku klasa A, uruchamia funkcję w innej klasie, w tym przypadku klasy B, w celu pobrania pewnych informacji z bazy danych.Konstruktor klasy ingerujący w inną klasę
Jednak, gdy B_runtime()
faktycznie wywołuje bazę danych, pojawia się błąd Cannot access protected property A::$db
.
Co ja nie rozumiem, jest to, że mimo, że mam dwie __construct
JEST W obu klasach oświadczenie PDO są bardzo trwałe na temat korzystania z połączenia z bazą danych z klasy A.
Jestem pewien, że to ma coś do z tym, że używam B_runtime()
z klasy A, ponieważ tak się nie stanie, jeśli zadzwonię do niego spoza klasy A.
Wiem, że mogę po prostu zmienić protected $db;
w klasie A na publiczną zmienną jednak jestem bardzo ciekawa, jak mogę to naprawić.
ob_start();
include('/config.php');
ob_end_clean();
$A = new A($db);
$B = new B($db);
echo $A->A_runtime();
class A{
protected $db;
public function __construct($db){
$this->db = $db;
}
public function A_runtime(){
return B::B_runtime();
}
}
class B{
protected $db;
public function __construct($db){
$this->db = $db;
}
public function B_runtime(){
$preparedStatement = $this->db->prepare('SELECT * FROM z_mod_html WHERE ModuleLink = :moduleid LIMIT 1');
$preparedStatement->execute(array(':moduleid' => '1'));
$rows = $preparedStatement->fetchAll();
return $rows[0]['HTML'];
}
}
Przepraszamy za długi kod - jeśli ktoś ma jakieś pomysły lub sugestie, byłby bardzo ceniony. Dzięki.
Yea doskonałą odpowiedzią, jednak istnieje sposób, że mogę to zrobić z dwóch konstruktorów jak ja teraz robi? – SineCosine
@SineCosine Możesz zachować wszystkich swoich konstruktorów. Właśnie umieściłem znak "// ...", na którym jest konstruktor, wszystko pozostaje takie samo. Zmienia się tylko metoda ("A_runtime") i sposób jej wywoływania. – kapa
Och, zupełnie to przegapiłem. Dzięki, nie wiedziałem, że możesz to zrobić. – SineCosine