Php: efficiently executing functions with one-time loadable classes several times in optional files

after reading the answers, I rewrote my question.

Say I have a theoretical php application that uses objects that do different things. For each page loaded by the application, different scripts will be launched.

Now I have created a simple PHP script that creates a simple object. (all this is compiled, I'm just trying to figure it out before I code it)

$user = new userClass($db);
$user->login($credentials);

everything is fine and I can even repeat the procedure several times after creating the user class

$user = new userClass($db);
$user->login($credentials);
...
$user->login($credentials2);

Now imagine if these 2 parts are divided into 2 different php files.

file1:
$user = new userClass($db);
$user->login($credentials);
file2:
$user->login($credentials2);

include file1
include file2

if they execute in order, everything is fine, but if they are not, or if file1 is not included at all ...

file2:
$user->login($credentials);
file1:
$user = new userClass($db);
$user->login($credentials2);

include file2
include file1

... , php, , .

main file:
$user = new userClass($db);
file1:
$user->login($credentials);
file2:
$user->login($credentials2);

( , )       file1    file2          file2    file1         include file2

file1 2 , , , 1 2 ?

main file:
$user = new userClass($db);
//nothing else gets loaded

, , , , , , ?

.

-, ( , ):

file1:
if(!is_object($user)){
    $user = new userClass($db);
}
$user->login($credentials);
file2:
if(!is_object($user)){
    $user = new userClass($db);
}
$user->login($credentials2);

, , , ?

...

class loader {
   private $objects;
   private $db;
   function __construct($db){
      $this->objects = array();
      $this->db = $db;
   }
   function __get($name){
      if(!isset($this->objects[$name])){
         return $this->objects[$name] = new $name($this->db);
      }
   }
}

main file:
$loader = new loader($db);
file1:
$loader->user->login($credentials);
file3:
$loader->user->login($credentials3);
file2:
$loader->user->login($credentials2);
file4:
$loader->user->login($credentials4);

, , , - , , , $db. , ()

script :

$user = new userClass($this->db);
$user->login($credentials);
$form = new formClass($_POST);
$form->process($info);

2 2

   class loader {
       private $objects;
       private $db;
       function __construct($db){
          $this->objects = array();
          $this->db = $db;
       }
       function getuserclass($name){
          if(!isset($this->objects[$name])){
             return $this->objects[$name] = new $name($this->db);
          }
       }
       function getformclass($name){
          if(!isset($this->objects[$name])){
             return $this->objects[$name] = new $name($_POST);//just an unrealistic example.
          }
       }
    }

main file:
$loader = new loader($db);
file1:
$loader->getuserclass('user')->login($credentials);
file3:
$loader->getformclass('form')->process($info);

.

?

0
3

, , :

class loader {
   private $objects;

   function __construct(){
      $this->objects = array();
   }

   function __call($name, $args){
      if(!isset($this->objects[$name])){
         return $this->objects[$name] = new $name($args);
      }
   }
}
$loader = new loader();

$user = $loader->user($db);
$form = $loader->form($form_args);

, , , , arg .

+1

imo, include() - . , . PHP ... , .

, , . , , , , , . . 'includes()' inline. , C. , - , .

, , , .

0

: , (,/modules/) , , .

( " " ) :

function __autoload($class_name) {
    if(!ctype_alnum(str_replace(array('-','_'), '',$class_name)))//filename check,security reasons
        die('Module name not valid! ');
    require_once 'modules/'.$class_name.'.php';//load the class
}

you may need to create a singleton class (this is an object template, it basically ensures that there is only one class object)

File: UserClass.php

<?php
class UserClass{
    private static $istance=null;
    private function UserClass($db){
        //your constructor code here
    };
    private static function getIstance($db){//you can call it init($db) and create a getInstace() that only return the instance,i prefer that way,do as you want.
        if($istance==null)
            $istance=new UserClass($db);
        return $istance;
    };
    function login($credentials){
            //....
    }
    //...other functions...
}
?>

now to use it you can just like that:

require 'main.php';//require the autoloader
$user=UserClass::getIstance($db);//the class file will be automatically included and a new istance will be created
$user->login($credentials1);
$user->login($credentials2);
$user=UserClass::getIstance($db);//no new istance will be created,only returned
$user->login($credentials3);
$user2=UserClass::getIstance($db);//no new istance will be created,only returned
$user2->login($credentials4);

//Userclass($db);// don't use like that,it will give you ERROR(it private like singleton pattern says)
0
source

All Articles