access Instances stored in an object in sub layers

1

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
    
asked by Francisco Núñez 24.10.2017 в 23:18
source

1 answer

4

You must first access Generic and the () are not necessary since it is an object that is apparently already instantiated:

$this->ObjClassInst['Generic']['CAPA5MANAGER'] ->pruebacapa5;

Regarding your new error ObjClassInst is a property of Class_MAIN therefore you can not access with $this in the other class but you can make the property statica and access it in this way:

<?php

<?php
class Class_MAIN{
    public $ObjClass;
    public static $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;
        }
        self::$ObjClassInst = [];
        self::$ObjClassInst = $this->AUTOLOAD->ClassPack($this->ObjClassInst);
    }
    public function Main() {
        self::$ObjClassInst['Generic']['CAPA3MANAGER'] ->pruebacapa3();
    }
}

class Class_Capa3Manager {
    function pruebacapa4(){
        Class_MAIN::$ObjClassInst['Generic']['CAPA4MANAGER']->pruebacapa4();
    }
}


class Class_Capa4Manager {
    function pruebacapa4(){
        Class_MAIN::$ObjClassInst['Generic']['CAPA5MANAGER']->pruebacapa5();
    }
}

class Class_Capa5Manager {
    function pruebacapa5(){
        echo "Lo lograste";
    }
}

Edition

This form will occupy fewer resources even.

<?php

spl_autoload_register(function ($className)
{

  $class = array (

    'Class_MAIN' => '/var/www/clases/Class_DateManager.php',
    'Class_DateManager' => '/var/www/clases/Class_DateManager.php',
    'Otro' => '/var/www/otro.php',
    'Class_Capa3Manager' => '/var/www/clases/Class_Capa3Manager.php',
    'Class_Capa4Manager' => '/var/www/clases/Class_Capa4Manager.php',
    'Class_Capa5Manager' => '/var/www/clases/Class_Capa5Manager.php',
    /*
      todos los archivos de clase.
    */
  );

  if (isset($class[$className]) && file_exists($class[$className]))
    require_once $class[$className];
});



class Class_MAIN{
    public $ObjClass;
    private static $ObjClassInst = array();
    public function __construct() {
        require_once 'const/Constant.php';
        require_once 'class/ClassManager.php';

        foreach ($this->ObjClass as $key => $Class) {
            require_once $Class;
        }
        self::$ObjClassInst = [];

    }
    public function Main() {
        Class_MAIN::getObject('Class_Capa3Manager')->pruebacapa3();
    }

    public static function getObject($className) {

        if (! isset(self::$ObjClassInst[$objectName]) ||  ! self::$ObjClassInst[$objectName] instanceof $className) {

          return self::$ObjClassInst[$objectName] = new $className();
        }
    }

    public static function clearObject($className) {

        if (isset(self::$ObjClassInst[$objectName])) {

          unset(self::$ObjClassInst[$objectName]);
        }
    }
}

class Class_Capa3Manager {
    function pruebacapa4(){
        Class_MAIN::getObject('Class_Capa4Manager')->pruebacapa4();
    }
}


class Class_Capa4Manager {
    function pruebacapa4(){
        Class_MAIN::getObject('Class_Capa5Manager')->pruebacapa5();
    }
}

class Class_Capa5Manager {
    function pruebacapa5(){
        echo "Lo lograste";
    }
}

The auto load is a separate file that is included in the index.php or in the index.php directly the case. If not all the requests enter by the index.php you must include the autoload at the beginning of the main file.

    
answered by 24.10.2017 / 23:25
source