Jump to content
php.lv forumi

Globāli objekti, singleton


Jackal

Recommended Posts

Iekš OOP vēl nav tik labas zināšanas un gribētu attrast labāku variantu. Nepatīk izmantot global katrā funkcijā, kur nepieciešams kāds objekts, piemēram, template. Ir pamata klases kā db, template, log, utt. Vajadzētu viņas padarīt pieejamas pilnīgi visur (citos objekotos) arī savā starpā. Esmu lasijis par singleton patternu, bet tā līdz galam neesmu iebraucis kā tas strādā.

 

Te it kā būtu singleton piemērs no php.net

 

<?php
class Example
{
// Hold an instance of the class
private static $instance;

// A private constructor; prevents direct creation of object
private function __construct() 
{
	echo 'I am constructed';
}

// The singleton method
public static function singleton() 
{
	if (!isset(self::$instance)) {
		$c = __CLASS__;
		self::$instance = new $c;
	}

	return self::$instance;
}

// Example method
public function bark()
{
	echo 'Woof!';
}

// Prevent users to clone the instance
public function __clone()
{
	trigger_error('Clone is not allowed.', E_USER_ERROR);
}

}

?>

 

Cik saprotu, lai varētu šo objektu, kuram ir singleton patterns, izmantot citā klasē, tad man vajag darīt kaut kā tā

 

<?php
class klase{
var $test;

function __construct(){
$this->test = Example::singleton();

}

function show(){
$this->test->bark();
}

}

?>

 

Vai pareizi esmu sapratis? Ja jā tad šis variants arī neliekas tas labākais, jo tad tik pat labi šī vietā "$this->test = Example::singleton();" var darīt arī tā:

 

<?php
$test = new Example();

class klase{
var $test;

function __construct(){
global $test;

$this->test = $test;

}

function show(){
$this->test->bark();
}

}

?>

 

Īsti nepatīk tas, ka katras klases konstruktorā sanāk rakstīt vienu un to pašu un, ja kādreiz nāk kāda klase klāt, tad arī jāpalabo visu pārējo klašu konstruktori, it kā jau nekad tās klases nebūs tik daudz, ka to nevarēs izdarīt, bet nu kā jau rakstiju, gribās atrast labāku variantu, protams, ja tāds vispār ir.

 

Ir idejas?

Link to comment
Share on other sites

class klase extends Example {
 function show(){
$this->bark();
	// vai
	// parent::bark();
 }
}

Tas, protams, atkarībā no vajadzības un cik ļoti viena klase balstās uz otras.

 

Šis variants derētu, ja man būtu viena globālā klase, bet diemžēl tādas ir vairākas (vismaz četras).

 

Bija doma darīt līdzīgi, tikai klasē, kuru extendoju visām pārējām klasēm, glabāt izveidotos objektus. Mēģināju, jau tādā veidā uztaisīt, bet īsti nestrādāja.

Edited by Jackal
Link to comment
Share on other sites

×
×
  • Create New...