Tüm sınıfları başlatılıyor?

2 Cevap php

Ben bir PHP acemi değilim. PHP Orkut benzeri bir sosyal ağ web sitesi geliştirdik.

Benim web sitesinin temel program akış index.php için her şeyi yönlendirmek olduğunu

Index.php $ _SERVER ['REQUEST_URI'] belirler ve yapılır ve çıkış işlemek gerekenleri yapar.

Ben bu ya da değil yapmak için iyi bir uygulama olup olmadığını bilmek istiyorum index.php üstündeki tüm sınıfları initiaze.

Index.php böyle başlar: -

// all the configuration files
require_once ("siteconfig.php");

// include library files / classes
require_once "lib/auth.php";
require_once "lib/album.php";
require_once "lib/db.php";
require_once "lib/form.php";
require_once "lib/inbox.php";
require_once "lib/social.php";
require_once "lib/profile.php";
require_once "lib/user.php";
require_once "lib/settings.php";
require_once "lib/validate.php";
require_once "lib/logs.php";
require_once "lib/sms.php";



// initialize all the classes
$db = new db($dbuser, $dbpass, $dbname, $dbhost);
$validate = new validate();
$auth = new auth();
$user = new user();
$profile = new profile();
$social = new social();
$settings = new settings();
$usersearch = new usersearch();
$album = new album();
$logs = new logs();
$liveupdates = new liveupdates();
$sms = new sms();

2 Cevap

Baştan tüm nesneleri başlatırken tabii ki kötü bir fikirdir. Daha az belirgin kullanarak "yeni", "ana" kod ya parlak bir düşünce değildir olmasıdır. İhtiyacınız nesneler (değil sınıflar) ile sağlayan bir "yükleyici" kullanın ve yükleyicinin "yeni" dışını önlemek.

 // WRONG

 class MainController 
 {
          function action_send_sms() {
              require 'lib/sms.php'; // or use autoload
              $sms = new MySmsClass();
              $sms->send(....)


 // RIGHT

 class Loader
 {
        function sms_object() {
              require 'lib/sms.php'; // or use autoload
              return new MySmsClass();
        }
  ....

 class MainController 
 {
          function action_send_sms() {
              $sms = $this->loader->sms_object();
              $sms->send(....)

/ / Edit: neden bu gerekir?

Eğer Sms nesnesini kullanan Controller bir dizi yöntemleri var düşünün. Eğer "yeni" ve açık bir sınıf adını (yukarıdaki "yanlış" yaklaşımı) kullanıyorsanız, 1) her iki yöntemde de nesne için (örn. sms gateway adresi) başlatma verilerini sağlamanız gerekir, 2) Eğer içinde Kontrolör kodunu düzenlemek zorunda case sınıf adı veya yapıcı imza değişiklikleri ve 3) can geçici değil Sms bir koşul yerel makinede test için (örneğin "DummySms") bağlı nesne değiştirin.

Eğer tam olarak bir kez tüm nesne başlatma kodu yazmak çünkü Loader sınıfının tüm sorunları, sorun yok.

(Daha doğrusu bu model http://martinfowler.com/articles/injection.html daha fazla bilgi için, bkz ServiceLocator denir).

Geçenlerde bu yıl öğrendim bir yöntem temelde aslında kapmak ve bir sınıf eklemek belirlemek için new anahtar kelime ile herhangi çağırmayı işlemek için bir spl autoloader kullanıyordum, ben bu tembel yükleme tasarım modelinin bir örneği olduğuna inanıyorum .

Üzerinde öğretici phpro.org Ben nasıl kullanılacağını öğrenmek için kullanılan biridir.

Bu yöntemi uygulamak için olsaydı size bazı kod refactor gerekebilir Ancak, sınıf değişken örnekleri biri ile nasıl etkileşimde görmek için bir kod parçası yapıştırmak için iyi bir örnek olabilir.