PHP> = 4.3.0 statik özelliklerini kullanarak?

2 Cevap php

Disclaimer: Yes, I am forced to support PHP 4.3.0. I know it's dead. No I can't upgrade it, because I'm dealing with multiple servers some of which I don't have su access.

Bu PHP5 özel beri ben self:: kullanamazsınız çünkü Peki, nasıl bir PHP4 sınıfta statik uygulama hakkında gitmeli? Şimdiye kadar benim araştırma ben en azından sadece bir işlev bağlamda, ben $ _GLOBALS kullanan başka bir yöntem gördüm ama ben kullanarak olacak sanmıyorum dışında static anahtar sözcüğünü kullanabilirsiniz görünüyor söyledi.

Sadece biz aynı sayfada ben 4 bu PHP5 statiği erişmek için gereken konum:

public static $_monthTable = array(
     31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
public static $_yearTable = array(
     1970 => 0,            1960 => -315619200);

Şimdiye kadar, ben bir bulunmazsa eğer temelde bir statik değişkeni ayarlar benim kendi fonksiyonu ile geldim, ve ben içine bütün statik özellikleri kodlamalısınız. Ancak, ben örneğinin değildir ve hiçbir yapıcı ben kullanamıyorum, yani ateş varsayarak, ben aynı sınıfta anter yöntem içinde bu statiği başvuru nasıl tamamen emin değilim $this.

class DateClass {

    function statics( $name = null ) {

        static $statics = array();

        if ( count( $statics ) == 0 ) {
            $statics['months'] = array(
                'Jan', 'Feb'
            );
        }

        if ( $name != null && array_key_exists($name, $statics ) ) {
            return $statics[$name];
        }
    }

};

var_dump( DateClass::statics('months') );

Question #1: bu uygulanabilir mi? Ben farklı bir yöntem kullanarak denemelisiniz?

Question #2: nasıl aynı sınıfta bir yöntem statiği başvurur? Ben denedim __CLASS__::statics ama ben gerçekten bir yöntem çağrılırken değilim __CLASS__ sadece bir dize olduğunu düşünüyorum.

Note: I Apache2'nin + / + IIS6 üzerinde kullanılacak bir çerçeve içine bu uygulama olacak, PHP 5.2, OSX / Linux / Windows PHP4.3.0.

2 Cevap

İlk soruyu cevaplarken, ben çözüm iyi olduğunu düşünüyorum. Değişkenler de set ve unset olabilir o yüzden uzanacak. I would de "prime" static $ statiği farklı, için unset değişkenlerin varsayılan değeri null.

<?php
class DateClass {
  function statics( $name, $value=null, $unset=null ) {
    static $statics;
    // better way to "prime" $statics, it's null by default
    if ( !$statics ) {
      $statics = array( "months" => array( "Jan", "Feb" ) );
    }
    if ( $value )
      $statics[ $name ] = $value;
    if ( $unset )
      unset( $statics[ $name ] );
    // don't worry about checking for existence
    // values of unset variables and array keys always are null
    // that's what you should return
    return $statics[ $name ];
  }
}

Ikinci soru ile ilgili, sen, DateClass::statics() her yerde kullanabilirsiniz hatta DateClass (statik veya değil) diğer yöntemleri içinde. PHP4 da bunu olmamalıdır rağmen örnek yöntemi olarak DateClass::statics() çağırabilirsiniz. (It is also possible to call instance methods statically, as long as there is a $this in the outer scope. That's not pretty and you should definitely not do that ;-)

Eğer gerçekten DateClass daha dinamik olmasını çağrısı istiyorsanız, call_user_func, sadece biraz daha ayrıntılı bulunuyor kullanabilirsiniz.

<?php
class DateClass {
  function statics( ... ) { ... }
  function anotherStaticFunc() {
    var_dump( DateClass::statics( 'months' ) );
    // using __CLASS__ and call_user_func
    var_dump(
      call_user_func( array( __CLASS__, 'statics' ), 'months' )
    );
  }
  function instanceMethod() {
    var_dump( $this->statics( 'months' ) );
  }
}

Genellikle dil özelliklerini taklit etmek kötü bir fikir. PHP 4 statik özelliklerini desteklemiyor beri, ben gibi-eğer görünmesi için akıllıca bir şey denemenizi tavsiye etmem. Ben en doğal şey global değişkenler kullanmak olduğunu söyleyebilirim. Temel olarak, bu statik bir özellik zaten budur - sadece isim alanlı bulunuyor. Yani nameclashes riskini en aza indirmek için, bir namespacing-kuralı kullanmak ve aslında aynı şey olacak. Örn. yerine:

class Foo {
  static $ninja = 42;
}

Kullanabilirsiniz

$GLOBALS['foo_ninja'] = 42;