Saya ingin membuat kelas statis di PHP dan membuatnya berperilaku seperti di C #, jadi
- Pembuat secara otomatis dipanggil pada panggilan pertama ke kelas
- Instansiasi tidak diperlukan
Sesuatu seperti ini ...
static class Hello {
private static $greeting = 'Hello';
private __construct() {
$greeting .= ' There!';
}
public static greet(){
echo $greeting;
}
}
Hello::greet(); // Hello There!
php
design-patterns
oop
static
aleemb
sumber
sumber
Jawaban:
Anda dapat memiliki kelas statis di PHP tetapi mereka tidak memanggil konstruktor secara otomatis (jika Anda mencoba dan memanggil
self::__construct()
Anda akan mendapatkan kesalahan).Oleh karena itu, Anda harus membuat
initialize()
fungsi dan memanggilnya di setiap metode:<?php class Hello { private static $greeting = 'Hello'; private static $initialized = false; private static function initialize() { if (self::$initialized) return; self::$greeting .= ' There!'; self::$initialized = true; } public static function greet() { self::initialize(); echo self::$greeting; } } Hello::greet(); // Hello There! ?>
sumber
Therefore you'd have to create an initialize() function and call it in each method:
akan lebih mudah untuk membuatinitialize
fungsi publik dan memanggilnya tepat setelah deklarasi kelas.__callStatic
, di sana Anda dapat melihat apakah itu diinisialisasi dan kemudian melakukanself::$method
atau apa pun yang Anda panggil. Jika masih memanggil metode secara langsung, coba ubah semuanya menjadi pribadi dan lihat di sana.Selain jawaban Greg, saya akan merekomendasikan untuk menyetel konstruktor pribadi sehingga tidak mungkin untuk membuat instance kelas.
Jadi menurut pendapat saya ini adalah contoh yang lebih lengkap berdasarkan Greg's:
<?php class Hello { /** * Construct won't be called inside this class and is uncallable from * the outside. This prevents instantiating this class. * This is by purpose, because we want a static class. */ private function __construct() {} private static $greeting = 'Hello'; private static $initialized = false; private static function initialize() { if (self::$initialized) return; self::$greeting .= ' There!'; self::$initialized = true; } public static function greet() { self::initialize(); echo self::$greeting; } } Hello::greet(); // Hello There! ?>
sumber
Anda dapat memiliki kelas seperti "statis". tetapi saya kira, ada sesuatu yang sangat penting hilang: di php Anda tidak memiliki siklus aplikasi, jadi Anda tidak akan mendapatkan statis nyata (atau tunggal) di seluruh aplikasi Anda ...
lihat Singleton di PHP
sumber
final Class B{ static $staticVar; static function getA(){ self::$staticVar = New A; } }
Struktur b disebut penangan tunggal Anda juga bisa melakukannya di a
Class a{ static $instance; static function getA(...){ if(!isset(self::$staticVar)){ self::$staticVar = New A(...); } return self::$staticVar; } }
ini adalah penggunaan tunggal
$a = a::getA(...);
sumber
Saya biasanya lebih suka menulis kelas non statis biasa dan menggunakan kelas pabrik untuk membuat instance tunggal (sudo statis) objek.
Dengan cara ini konstruktor dan destruktor bekerja seperti biasa, dan saya dapat membuat instance non-statis tambahan jika saya mau (misalnya koneksi DB kedua)
Saya menggunakan ini sepanjang waktu dan sangat berguna untuk membuat penangan sesi penyimpanan DB kustom, seperti ketika halaman berakhir, destruktor akan mendorong sesi ke database.
Keuntungan lainnya adalah Anda dapat mengabaikan pesanan yang Anda panggil karena semuanya akan diatur sesuai permintaan.
class Factory { static function &getDB ($construct_params = null) { static $instance; if( ! is_object($instance) ) { include_once("clsDB.php"); $instance = new clsDB($construct_params); // constructor will be called } return $instance; } }
Kelas DB ...
class clsDB { $regular_public_variables = "whatever"; function __construct($construct_params) {...} function __destruct() {...} function getvar() { return $this->regular_public_variables; } }
Di mana pun Anda ingin menggunakannya, panggil saja ...
Kemudian perlakukan saja semua metode sebagai non-statis (karena memang demikian)
echo $static_instance->getvar();
sumber
objek tidak dapat didefinisikan secara statis tetapi ini berfungsi
final Class B{ static $var; static function init(){ self::$var = new A(); } B::init();
sumber