Nasıl bir değişken sınıf statik bir yöntem arayabilirim?

6 Cevap php

Ben belirli bir değişkenin bir sınıfını başlatır yükler ve fonksiyonu çeşit yapmaya çalışıyorum. Böyle bir şey:

<?php
function loadClass($class) {
  $sClassPath = SYSPATH."/classes/{$class}.php";
  if (file_exists($sClassPath)) {
    require_once($sClassPath);
    $class = $class::getInstance();
  }
}
?>

Ben bu gibi kullanırsanız:

<?php
  loadClass('session');
?>

Bu oturum sınıfını içerir ve örneğini gerekir.

BTW: statik getInstance işlevi bu kodu geliyor:

<?php
  function getCallingClass() {
    $backtrace = debug_backtrace();
    $method    = $backtrace[1]['function'];
    $file      = file($backtrace[1]['file']);
    $line      = $file[($backtrace[1]['line'] - 1)];
    $class     = trim(preg_replace("/^.+?([A-Za-z0-9_]*)::{$method}\(.*$/s", "\\1\\2", $line));

    if(! class_exists($class)) {
      return false;
    } return $class;
  }

  class Core {

    protected static $instances = array();

    public static function getInstance() {
      $class = getCallingClass();

      if (!isset(self::$instances[$class])) {
        self::$instances[$class] = new $class();
      } return self::$instances[$class];
    }

  }

?>

I'm kinda lost (I even tried to use eval :P). Can someone help me. You'll put a big smile on my face.

Şimdiden teşekkürler ...


Şey şu anda bir sınıfta işlevleri kullanmak için yolu bu olduğunu:

<?php
  $session = session::getInstance();
?>

But now I want to build that into a function so that I never again have to use that line of code. I just say loadClass('session'); and than I can use $session->blablablafunction();

6 Cevap

Değişken bir sınıf adına statik işlevleri çağıran PHP 5.3 görünüşte mevcuttur:

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0

http://www.phpbuilder.com/manual/language.oop5.static.php

Kesinlikle şu anda kendimi o kullanabilirsiniz.

O zamana kadar gerçekten yüklediğiniz her sınıf bir singleton olarak tasarlanmış olduğunu kabul edemeyiz. Bu yüzden uzun süre kullandığınız gibi < 5.3 Sadece sınıfı yüklemek ve kurucusuna yoluyla örneğini gerekir:

function loadClass($class) {
  $sClassPath = SYSPATH."/classes/{$class}.php";
  if (file_exists($sClassPath)) {
    require_once($sClassPath);
    $class = new $class;
  }

}

VEYA

Sadece ondan bir nesne yaratmadan sınıfı yüklemek. Sonra çağrı ":: getInstance ()" tekil olması gerekiyordu olanlar ve loadClass () fonksiyonu dışarıdan değil, olanlar üzerinde "yeni" üzerine.

Diğerleri daha önce de belirttiğimiz gibi, bir __ autoload () muhtemelen sizin için çalışacak, rağmen.

Neden __ autoload () fonksiyonunu kullanmak değil mi?

http://www.php.net/autoload

gerektiğinde o zaman sadece nesne örneğini.

Eğer getCallingClass ile çemberin içinden atlama neden olan, bağlayıcı PHP'nin mevcut uygulama statik mücadele gibi görünüyor. Ben deneyimlerinden söyleyebilirim, muhtemelen statik bir yöntemle bir üst sınıfta örnekleme koymak için çalışıyor terk etmelidir. Size sonunda daha fazla sorunlara neden olur. PHP 5.3 "late static binding" uygulayacak ve sorunu çözmek gerekir, ama tabii ki şimdi yardımcı olmuyor.

Muhtemelen sağlam Singleton uygulaması ile kombine kodisha tarafından belirtilen özdevinimli_yükle işlevini kullanarak daha iyi. Ben Amacınız sözdizimsel şeker olup olmadığından emin değilim, ama bir kaç karakter kurtarmaya çalışırken sakınmak için uzun vadede daha iyi yapacağını düşünüyorum.

: Kafamın üst kapalı, test, doğrulama vb ihtiyacı

<?php

    function loadClass($className) {
    	if (is_object($GLOBALS[$className]))
    		return;

    	$sClassPath = SYSPATH."/classes/{$className}.php";
    	if (file_exists($sClassPath)) {
            require_once($sClassPath);

    		$reflect = new ReflectionClass($className);
    		$classObj = $reflect->newInstanceArgs();
    		$GLOBALS[$className] = $classObj;
    	}
    }

?>

Geç statik bağlamaları bence sizin için çalışacak. Her sınıfın yapı yapılacak:

class ClassName
{
    public static $instances = array();

    public function __construct()
    {
        self::$instances[] = $this;
    }
}

Then... Here is an autoloader I created. See if this solves your dilemma.

// Shorten constants for convenience
define ('DS', DIRECTORY_SEPARATOR);
define ('PS', PATH_SEPARATOR);
$template = "default";

// Define an application path constants
define ('APP_ROOT', realpath('.').DS);
define ('VIEW', APP_ROOT . 'Views' . DS);
define ('MODEL', APP_ROOT . 'Models' . DS);
define ('CONTROLLER', APP_ROOT . 'Controllers' . DS);
define ('TEMPLATE', VIEW."templates".DS.$template.DS);
define ('CONTENT', VIEW."content".DS);
define ('HELPERS', MODEL."helpers".DS);

// Check if application is in development stage and set error reporting and
// logging accordingly

error_reporting(E_ALL);
if (defined('DEVELOPMENT')) {
    ini_set('display_errors', 1);
} else {
    ini_set('display_errors', 0);
    ini_set('log_errors', 'On');
    ini_set('error_log', APP_ROOT.'error.log');
}

$paths = array(APP_ROOT, VIEW, MODEL, CONTROLLER, TEMPLATE, CONTENT, HELPERS);

// Set the include path from Config Object
set_include_path(implode(PS, $paths));

// Autoloader
function __autoload($class)
{
    require_once $class.'.php';
    return;
}

Daha sonra yapmanız gereken tek şey

$var = new ClassName();

but you have to have a php file in the path with the name ClassName.php where ClassName is the same as the name of the class you want to instantiate.