I have a very small problem:
declare a Main class with property in the following way, so that it loads the files require_once dynamically, depending on the classes that it has stored in some folders, and it works correctly, also it is in charge of calling a function in another file that is in charge of instantiating the classes and stores them in a property of type object:
<?php
class Class_MAIN{
public $ObjClass;
public $ObjClassInst;
public function __construct() {
require_once 'const/Constant.php';
require_once 'class/ClassManager.php';
$this->AUTOLOAD = new ClassManager();
$this->ObjClass = [];
$this->ObjClass = $this->AUTOLOAD->LoadClass($this->ObjClass);
foreach ($this->ObjClass as $key => $Class) {
require_once $Class;
}
$this->ObjClassInst = [];
$this->ObjClassInst = $this->AUTOLOAD->ClassPack($this->ObjClassInst);
}
public function Main() {
$this->ObjClassInst['Generic']['CAPA3MANAGER'] ->pruebacapa3();
}
}
?>
This works correctly and generates an object in the class index. It saves me every Instanced Class:
array(1) {
["Generic"]=> array(3) {
["CAPA5MANAGER"]=> object(Class_Capa5Manager)#3 (0) { }
["CAPA4MANAGER"]=> object(Class_Capa4Manager)#4 (0) { }
["CAPA3MANAGER"]=> object(Class_Capa3Manager)#5 (0) { }
}
}
The library that generates this object, which makes the require_once of each class according to the directory and which in turn stores the intancias in the following ClassManager object:
<?php
class ClassManager {
public function LoadClassExternal(&$ObjClass) {
$External = scandir(EXTCLASS, 1); # Directorio de archivos
foreach ($External as $key => $name) {
if (strpos($name, 'class.') !== false) {
#require_once EXTCLASS.''.
$ObjClass[$name] = EXTCLASS . $name;
} elseif(strpos($name, 'phpMailer') !== false) {
$ObjClass[$name] = EXTCLASS . $name .'/PHPMailerAutoload.php';
} elseif(strpos($name, 'html2pdf') !== false) {
$ObjClass[$name] = EXTCLASS . $name .'/html2pdf.class.php';
} elseif(strpos($name, 'fpdf') !== false) {
$ObjClass[$name] = EXTCLASS . $name .'/fpdf.php';
}
}
return $ObjClass;
}
public function LoadClassGeneric(&$ObjClass) {
$Generic = scandir(GENCLASS, 1); # Directorio de archivos
foreach ($Generic as $key => $name) {
if (strpos($name, 'class.') !== false) {
$ObjClass[$name] = GENCLASS . $name;
}
}
return $ObjClass;
}
public function LoadClassCRON(&$ObjClass) {
$Cron = scandir(CRONCLASS, 1); # Directorio de archivos
foreach ($Cron as $key => $name) {
if (strpos($name, 'class.') !== false) {
$ObjClass[$name] = CRONCLASS . $name;
}
}
return $ObjClass;
}
public function LoadClassMVC(&$ObjClass) {
$MVC = scandir(MVCCLASS, 1); # Directorio de archivos
foreach ($MVC as $key => $name) {
if (strpos($name, 'class.') !== false) {
$ObjClass[$name] = MVCCLASS . $name;
}
}
return $ObjClass;
}
public function LoadClassCORE(&$ObjClass) {
$CoreD = scandir(CORECLASS, 1); # Directorio de archivos
foreach ($CoreD as $key => $nameD) {
if (strpos($nameD, 'doc') !== false) {
$CoreF = scandir(CORECLASS.$nameD.'/', 1); # Directorio de archivos
foreach ($CoreF as $key => $nameF) {
if (strpos($nameF, 'doc') !== false) {
$ObjClass[$nameF] = CORECLASS.$nameD.'/' . $nameF;
}
}
}
if (strpos($nameD, 'form') !== false) {
$CoreF = scandir(CORECLASS.$nameD.'/', 1); # Directorio de archivos
foreach ($CoreF as $key => $nameF) {
if (strpos($nameF, 'form') !== false) {
$ObjClass[$nameF] = CORECLASS.$nameD.'/' . $nameF;
}
}
}
if (strpos($nameD, 'list') !== false) {
$CoreF = scandir(CORECLASS.$nameD.'/', 1); # Directorio de archivos
foreach ($CoreF as $key => $nameF) {
if (strpos($nameF, 'list') !== false) {
$ObjClass[$nameF] = CORECLASS.$nameD.'/' . $nameF;
}
}
}
if (strpos($nameD, 'modal') !== false) {
$CoreF = scandir(CORECLASS.$nameD.'/', 1); # Directorio de archivos
foreach ($CoreF as $key => $nameF) {
if (strpos($nameF, 'modal') !== false) {
$ObjClass[$nameF] = CORECLASS.$nameD.'/' . $nameF;
}
}
}
if (strpos($nameD, 'not') !== false) {
$CoreF = scandir(CORECLASS.$nameD.'/', 1); # Directorio de archivos
foreach ($CoreF as $key => $nameF) {
if (strpos($nameF, 'not') !== false) {
$ObjClass[$nameF] = CORECLASS.$nameD.'/' . $nameF;
}
}
}
if (strpos($nameD, 'process') !== false) {
$CoreF = scandir(CORECLASS.$nameD.'/', 1); # Directorio de archivos
foreach ($CoreF as $key => $nameF) {
if (strpos($nameF, 'process') !== false) {
$ObjClass[$nameF] = CORECLASS.$nameD.'/' . $nameF;
}
}
}
}
return $ObjClass;
}
public function LoadClass(&$ObjClass) {
#require files
$this->LoadClassExternal($ObjClass);
$this->LoadClassGeneric($ObjClass);
$this->LoadClassCRON($ObjClass);
$this->LoadClassMVC($ObjClass);
$this->LoadClassCORE($ObjClass);
return $ObjClass;
}
public function ClassPackExternal(&$ObjClassInst) {
return $ObjClassInst;
}
#Esta Seccion es la que instancia las Clases
public function ClassPackGeneric(&$ObjClassInst) {
$Generic = scandir(GENCLASS, 1); # Directorio de archivos
foreach ($Generic as $key => $name) {
if (strpos($name, 'class.') !== false) {
$name=preg_replace('#\.php#', '', $name);
$names=explode(".", $name);
foreach ($names as $key => $namesr) {
$names[$key]=ucfirst(strtolower($namesr));
}
$name=implode('_', $names);
$NamesClass = $name.'Manager';
$InstanceClass = strtoupper(preg_replace('#\Class_#', '', $NamesClass));
#$ObjClassInst['Generic'][$InstanceClass] = $NamesClass;
$ObjClassInst['Generic'][$InstanceClass] = $this->$InstanceClass= new $NamesClass();
}
}
return $ObjClassInst;
}
public function ClassPackCRON(&$ObjClassInst) {
return $ObjClassInst;
}
public function ClassPackMVC(&$ObjClassInst) {
return $ObjClassInst;
}
public function ClassPackCORE(&$ObjClassInst) {
return $ObjClassInst;
}
public function ClassPack(&$ObjClassInst){
#require files
$this->ClassPackExternal($ObjClassInst);
$this->ClassPackGeneric($ObjClassInst);
$this->ClassPackCRON($ObjClassInst);
$this->ClassPackMVC($ObjClassInst);
$this->ClassPackCORE($ObjClassInst);
return $ObjClassInst;
}
}
?>
until I get to layers 4 and 5:
files separately:
<?php
class Class_Capa3Manager {
function pruebacapa3(){
$this->ObjClassInst['Generic']['CAPA4MANAGER'] ->pruebacapa4();
}
}
?>
files separately:
<?php
class Class_Capa4Manager {
function pruebacapa4(){
$this->ObjClassInst['Generic']['CAPA5MANAGER'] ->pruebacapa5();
}
}
?>
files separately:
<?php
class Class_Capa5Manager {
function pruebacapa5(){
echo 'lo Logre';
}
}
?>
How should I declare the Property: public $ObjClassInst;
so that it is accessible in any of the layers, ** without needing to pass it as a parameter, without using extend [ClassName] and be able to call it as it is in layers 3 and 4? **.
Notice: Undefined property: Class_Capa3Manager::$ObjClassInst in C:\xampp\htdocs\dev\t2\class\classgen\class.capa3.php on line 4
Fatal error: Uncaught Error: Call to a member function pruebacapa4() on null in C:\xampp\htdocs\dev\t2\class\classgen\class.capa3.php:4 Stack trace: #0
C:\xampp\htdocs\dev\t2\class.Main.php(18): Class_Capa3Manager->pruebacapa3() #1
C:\xampp\htdocs\dev\t2\index.php(15): Class_MAIN->Main() #2 {main} thrown in
C:\xampp\htdocs\dev\t2\class\classgen\class.capa3.php on line 4