2010-04-30 10 views
10

Mam jeden plik main.php z definicją klasy. Inne pliki php do tego pliku main.phpJak mogę wykonać blok kodu dokładnie raz w PHP?

//main.php 

<?php 

class A{ 


} 

//I want to execute the following statements exactly once  

$a = new A(); 
/* 
Some code 
*/ 


?> 

używam main.php w innych plikach php jak

//php1.php 
<?php 
require_once("main.php"); 

$b = new A(); 

/* 
Some code 
*/ 

?> 

//php2.php 
<?php 
require_once("main.php"); 

$b = new A(); 

/* 
Some code 
*/ 

?> 

Czy istnieją jakieś oświadczenie w PHP jak execute_once()? Jak rozwiązać ten problem?

+5

użycie wymagać raz jest to, czego potrzebujesz. Twój plik zostanie dołączony jeden raz. Upewnij się, że przeczytałeś instrukcję for require_once(), include() i include_once(); – Andreas

+0

Jeśli komentarz andreas nie odpowiada na twoje pytanie, czy możesz wyjaśnić bardziej szczegółowo, co chcesz osiągnąć? –

+0

Główna.Plik php zostanie dołączony przez kilka innych plików php. Chcę, aby kod w pliku main.php (po klasie defn) został wykonany dokładnie raz, bez względu na to, ile plików go zawiera. Globalnie raz nie lokalnie raz. – Bruce

Odpowiedz

9

nie mogę zobaczyć, jak oryginalne pytanie odnosi się do przyjętej odpowiedź. Jeśli chcę, aby upewnić się, że niektóre kod nie jest wykonywana więcej niż raz przez skrypty firm trzecich, które zawierają go, po prostu stworzyć flagę:

<?php 

if(!defined('FOO_EXECUTED')){ 
    foo(); 

    define('FOO_EXECUTED', TRUE); 
} 

?> 

wzorce Singleton tylko wymusza, że ​​wszystkie zmienne, które instanciate jedna klasa faktycznie wskazują na tę samą tylko instancję.

+0

Naprawdę muszę się z Tobą zgodzić ... mniej narzutów tutaj IMO – espais

+0

Ale czy ten wątek jest bezpieczny w kontekście php + apache? – Keshav

+1

@Keshav Nie wiem, o co ci chodzi, ale skrypty PHP działają niezależnie jeden od drugiego. –

3

Myślę, że potrzebujesz Singleton pattern. Tworzy tylko jedną instancję klasy i zwraca ją za każdym razem, gdy jej zażądasz.

W inżynierii oprogramowania, wzorzec Singleton jest wzorcem projektowym używanym do realizacji koncepcji matematycznych Singleton, ograniczając konkretyzacji klasy do jednego obiektu. Jest to użyteczne, gdy wymagany jest jeden obiekt, aby koordynować działania w systemie za pomocą . Pojęcie jest czasem uogólniane na systemy , które działają bardziej efektywnie, gdy tylko jeden obiekt istnieje, lub że ogranicza instancję do pewnej liczby obiektów (powiedzmy pięciu). Niektórzy uważają, że jest to anty-wzór, sądząc, że jest nadużywane, wprowadza niepotrzebne ograniczenia w sytuacjach, gdy w rzeczywistości nie jest wymagany jedynym instancją klasy i wprowadza stan globalny do aplikacji .

Aktualizacja oparta na PO Komentarz:

proszę zobaczyć:

The Singleton Design Pattern for PHP

+0

Jak zaimplementować go w PHP? Mam teorię, ale jak ją wdrożyć? – Bruce

+1

@Jack googling na singleton PHP nie pomaga? –

+0

@Jack: Zobacz moją zaktualizowaną odpowiedź. Dzięki – Sarfraz

1

Właśnie napisałem klasę dla tego.

Ponieważ nazywa statycznie zmienna powinna trzymać się przez całą aplikację, jeśli zawarte w bootstrap poziomu aplikacji.

Można również zdecydować się na wykonanie kodu określoną liczbę razy.

class exec{  
    public static $ids = array(); 
    public static function once($id){ 
    if(isset(static::$ids[$id])){ 
     return false; 
    } else { 
     if(isset(static::$ids[$id])){ 
     static::$ids[$id]++; 
     } else { 
     static::$ids[$id] = 1; 
     } 
     return true; 
    } 
    } 
    public static function times($id, $count=1){ 
    if(isset(static::$ids[$id])){ 
     if($count == static::$ids[$id]){ 
     return false; 
     } else { 
     static::$ids[$id]++; 
     return true; 
     } 
    } else { 
     static::$ids[$id] = 1; 
     return true; 
    } 
    } 
} 

//usage 

foreach(array('x', 'y', 'z') as $value){ 
    if(exec::once('tag')){ 
    echo $value; 
    } 
} 

//outputs x 

foreach(array('x', 'y', 'z') as $value){ 
    if(exec::times('tag2', 2)){ 
    echo $value; 
    } 
} 

//outputs xy 
Powiązane problemy