Проблем с PHP Memory Leaks

F1r3Fl3x

Registered
Здравейте, започнах отново да програмирам на PHP и се опасявам, че съм позабравил това-онова.
Проблемът ми е, че кода, който пиша в момента най-вероятно има memory leak.

Ето кода:
Код:
class App{

static public function getInstance(){
// Singleton модел
}

private function __construct(){
    $this -> ne6to =Ne6to::getInstance();
}

public function func(){
...
}
}
class Ne6to{

static public function getInstance(){
....
}

private function __construct(){
     $app = App::getInstance();
    $app -> func();
}

}
}

Ако извикам App::getInstance();
Ще се получи memory leak, нали ?
Как мога да преобразувам кода си, като запазя структурата му и премахна memory leak-а ?
 
1) public static, а не static public

ПП: Хванахте ме :D признавам си че съм новак в тази област, но ми е интересно.
 
d_badboy каза:
1) public static, а не static public
Няма значение какъв е реда. И по двата начина работи. По-лесно ми е да разгранича статичните функции по този начин.
 
Не разбирам защо използваш class Ne6to?

Singleton се прави най-лесно така:

class Class_name
{
// Променливата, в която ще пазиш единствено една инстанция на класа
private static $instance;

private function __construct() { ... }

public static function getInstance()
{
if (!self::$instance)
{
self::$instance = new Class_name ();
}

return self::$instance;
}
}

d_badboy,абсолютно никакво значение няма как ще ги подредиш :)

Конструктура трябва да е private, и вместо да създаваш обект така:

$obj = new Class_name();

го създаваш така:

$obj = Class_name::getInstance();
 
@Adrian, и аз така правя Singleton-а, само че ме домързя да го напиша целия в примера ми.
Използвам нещо, защото искам да мога да ползвам $app -> ne6to -> ...
Защото ще имам и други като него ( $app -> ne6to2 ->..., $app -> ne6to3 -> ...), а във всички тях ще се наложи да използвам функция от главния клас $app и се притеснявам да не объркам нещата и да стане mem leak :/
 
Не можеш ли просто да наследяваш този клас? Не мога да схвана каква точно ти е идеята
 
Давам ти пример, който ти си написал в предишна тема:
Код:
$CI =& get_instance();
$CI->load->library('session');
$CI->session->set_userdata('some_name','some_value');
Идеята ми е за изчистен семантичен код, като този на CI :)
Просто проблема е в това, че трябва да инстанцииорам главния клас (App) в другите класове, защото искам да използвам една функция от него в тях. От там ми идва проблема :/
Ще взема да направя функцията статична и ще вероятно ще си реша проблема :lol:
 
Не би трябвало да има memory leak. А и това е скриптов език - пускаш го, прави каквото трябва и всичко се чисти. Евентуално може да попречи на garbage collectorа да "събере буклука", защото клас A съдържа референс към клас B, а B към A. Примерно ако ползваш unset() на един от двата няма да освободиш паметта за тези 2 класа.

Друго - това са singleton-и, не е като да правиш нов инстанс в цикъл и да ти трябва да го триеш после за да освободиш памет.

ПП. Това му се вика circular reference. Може да прочетеш статии в интернет. :)

ПП2. Явно от php 5.3 garbage collectora е поумнял и може да чисти и такива... Ако е включен разбира се
http://www.php.net/manual/en/function.gc-enabled.php
http://www.php.net/manual/en/function.gc-enable.php
http://www.php.net/manual/en/function.gc-disable.php
Но поради скриптовата природа на php това практически не ти трябва.
 
Ами виж как са го направили в CI :)

class CI_Base {

private static $instance;

public function CI_Base()
{
self::$instance =& $this;
}

public static function &get_instance()
{
return self::$instance;
}
}

function &get_instance()
{
return CI_Base::get_instance();
}
 
Какъв е смисъла конструктора да се прави частен тип като винаги ще връща грешка. Най-добре е един главен клас, както CI са направили и чрез конструктора да се взима инстанцията.
 
Релакс, това и правя :)
Разгледах статии в интернет и изглежда, че този начин на действие не прави лийкове :)
Ето тук има опрестен MVC модел, точно такъв каквъто исках да си напиша :)
http://phpro.org/tutorials/Model-View-Controller-MVC.html
 
Аз използвам Multiton. На отделни променливи задавам инстанции и си ги ползвам така... $VAR->function();
 

Back
Горе