php: isteğe bağlı dosyaları verimli bir kerelik yüklü sınıfları ile fonksiyonları çalıştıran birden çok kez

0 Cevap php

yanıtları okuduktan sonra ben sorumu tekrar yazmış.

Let's say I have a theoretical php application that uses objects that do different things. For every page that gets loaded by the application, different scripts will be run.

now I made a simple php script that creates a simple object. (this is all made up, I'm just trying to understand this before I code it)

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

hepsi gayet iyi ve hatta kullanıcı sınıfını oluşturduktan sonra prosedür birkaç kez tekrarlayabilirsiniz

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

Bu 2 parça 2 farklı php dosyaları bölünmüş eğer şimdi düşünün.

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

include file1
include file2

onlar için çalışması halinde tüm ince, ama onlar değilse, ya da dosya1 hiç dahil değilse ...

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

include file2
include file1

o yüzden ne olursa olsun yüklenen bir ana php dosyası yapmak sağlayan, onlar düzeni korumak zorunda ... çalışmaz.

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

(included files with autoloading for example) include main include file1 include file2 or include main include file2 include file1 or include main include file2

şimdi dosya1 ve 2 herhangi bir sırayla yüklenebilir, ve bir diğer bağlı değildir, fakat dosya1 veya file2 hem gereksiz ne olur?

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

sonra ana dosya emin, aynı zamanda gereksiz olduğunu ve bir kaynak domuzu olacağına eğer onun bir sınıf sorun yok, ama ne alışmak asla sınıfların ana dosya yükler yüzlerce eğer?

değil zarif at all.

O zaman bunu başka bir şekilde yapmak için çalışalım, en tamamen ana dosyası hurda ve (aşağıda elde etmek istiyorum ne çıplak kemik örnektir) bunu şöyle yapalım:

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

Emin, çalışır, ama zarif değil, şimdi mi?

yöntemi aşırı yüklemeye deneyelim ...

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);

seems to work, until you realize that you can no longer give any of the objects that are created this way any other variable except $db. This means that loader class is limited to use with user class only (for example) because using loader class with any other class will require editing of the loader class

ve bu gibi basit bir script:

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

2 ayrı yükleyici sınıfları veya yükleyici sınıfında en az 2 yöntem gerektirir

   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);

ama bu da şık değil.

Bu nasıl really yapılması gerekiyordu?

0 Cevap