2016-10-31 11 views
5

Mam blok kodu, którego potrzebuję użyć w wielu miejscach mojej aplikacji.Podział kodu PHP modułu na oddzielne pliki włączeń

Przykład:

$count_device = VSE::count_device($cpe_mac); 
$c_devices = $count_device['Count_of_devices']; 
$c_active = $count_device['Count_of_active']; 
$c_inactive = $count_device['Count_of_inactive']; 
$c_offline = $count_device['Count_of_offline']; 

Teraz one są 10 moich kontrolerów. Jeśli muszę coś naprawić, muszę naprawić w miejscach 10.

Poszukuję lepszego sposobu kontrolowania tego.


myślałem o napisaniu funkcji

public static function get_device_info($cpe_mac){ 

    $count_device = VSE::count_device($cpe_mac); 
    $c_devices = $count_device['Count_of_devices']; 
    $c_active = $count_device['Count_of_active']; 
    $c_inactive = $count_device['Count_of_inactive']; 
    $c_offline = $count_device['Count_of_offline']; 

} 

Kiedy wywołać tą funkcję: $devices = get_device_info($cpe_mac);

Mam dostęp do 1 zmiennej, która jest $devices tylko.

Nie będę mieć dostępu do wszystkich moich zmiennych 5 w tej funkcji.

  • $ count_device
  • $ c_devices
  • $ c_active
  • $ c_inactive
  • $ c_offline


Znalazłem get_defined_vars, ale to nie jest r eally czego szukam.


Pytanie

Jak można by go o to i wdrożyć?

Jak przenieść blok kodu i dołączyć go ponownie?

Czy powinienem zacząć od zapoznania się z PHP Require/Include?


Otwieram na wszelkie sugestie w tej chwili.

Wszelkie wskazówki/sugestie/pomoc w tym zakresie będą mile widziane!

+6

Dlaczego musisz ustawić wszystkie te zmienne, czy nie możesz po prostu użyć tablicy? Wydaje się dużo łatwiejsze. – jeroen

Odpowiedz

4

Robię to cały czas, szczególnie w celu użycia tego samego nagłówka/stopki w całej witrynie. Po prostu umieść tę linię w dokumencie, w którym chcesz żądać kodu.

<?php require_once('php/code_block_one.php'); ?> 

Jeśli chcesz wywołać ten sam blok kodu kilka razy na jednej stronie, aby zmienić require_oncerequire.

+0

To spowoduje uruchomienie kodu tylko raz. Jeśli zadzwonisz do tego dwa razy, nie będzie już działać. Nie używaj 'require_once'. Zamiast tego użyj 'require'. – SOFe

+0

Jest to również słaba struktura kodu, jeśli każdy fragment zostanie umieszczony w oddzielnym pliku. Pliki łatwo się pogubią. – SOFe

+0

Skomentowałeś, zanim mogłem opublikować moją edycję i chociaż nie mogę wymyślić wystąpienia, w którym funkcje lub duplikaty deklaracji zmiennych byłyby wymagane dwukrotnie w dokumencie, zaktualizowałem odpowiedź na to konto. –

2

Użyj polecenia przekaż.

public static function 
get_device_info($cpe_mac, &$count_device, &$c_devices, &$c_active, &$c_inactive, &$c_offline){ 

    $count_device = VSE::count_device($cpe_mac); 
    $c_devices = $count_device['Count_of_devices']; 
    $c_active = $count_device['Count_of_active']; 
    $c_inactive = $count_device['Count_of_inactive']; 
    $c_offline = $count_device['Count_of_offline']; 

} 

// now to call this function... 
Clazz::get_device_info("cpe_mac", $count_device, $c_devices, $c_active, $c_inactive, $c_offline); 
var_dump($count_device, $c_devices, $c_active, $c_inactive, $c_offline); 
// they output useful data! 

Ponadto, w zależności od przypadku użycia, jeśli kod PHP nie jest wdrażany od źródła do serwera bezpośrednio (np jeśli wydałeś pakowane phars, etc.), może chcesz używać cpp ('C' preprocesor), aby wstępnie przetworzyć twoje pliki.

1
//METHOD 1 
public static $c_devices = null; 
public static $c_active = null; 
public static $c_inactive = null; 
public static $c_offline = null; 

public static function get_device_info($cpe_mac){ 

    $count_device = VSE::count_device($cpe_mac); 
    self::$c_devices = $count_device['Count_of_devices']; 
    self::$c_active = $count_device['Count_of_active']; 
    self::$c_inactive = $count_device['Count_of_inactive']; 
    self::$c_offline = $count_device['Count_of_offline']; 

} 

ClassName::$c_devices; 
ClassName::$c_active; 
ClassName::$c_inactive; 
ClassName::$c_offline; 




//METHOD 2 
public static $cpe_mac = null; 

public static function get_device_info($key){ 
    $count_device = VSE::count_device(self::$cpe_mac); 
    return $count_device[$key]; 

} 

ClassName::$cpe_mac = $cpe_mac; 
ClassName::get_device_info('Count_of_devices'); 
ClassName::get_device_info('Count_of_active'); 
ClassName::get_device_info('Count_of_inactive'); 
ClassName::get_device_info('Count_of_offline'); 
4

Można zawinąć wszystko w klasie DeviceInfo, a następnie po prostu użyć właściwości tej klasy.

class DeviceInfo 
{ 
    public $c_devices; 
    public $c_active; 
    public $c_inactive; 
    public $c_offline; 

    public function __construct($cpe_mac) { 

     $count_device = VSE::count_device($cpe_mac); 

     $this->c_devices = $count_device['Count_of_devices']; 
     $this->c_active = $count_device['Count_of_active']; 
     $this->c_inactive = $count_device['Count_of_inactive']; 
     $this->c_offline = $count_device['Count_of_offline']; 
    } 
} 

mieć klasę we własnym pliku o nazwie DeviceInfo.php, to gdzie jest to potrzebne tylko

include_once("DeviceInfo.php"); 

w górnej części pliku i utworzyć nową instancję tej klasy. (Używam include_once aby upewnić się, że klasa DeviceInfo nie jest na nowo, jeśli jej już zdefiniowane)

$deviceInfo = new DeviceInfo($cpe_mac); 

Można uzyskać dostęp do wartości poprzez dostęp do właściwości jak ten.

$deviceInfo->c_devices; 

ten sposób można uzyskać uzupełniania kodu dla wartości (w zależności od IDE) i nie muszą polegać na zapamiętywanie nazw klawiszy tablicy kiedy rzeczywiście chcą wykorzystywać te informacje w kodzie.

Jeśli chcesz posunąć się o krok dalej, możesz nawet dodać funkcje getter do tej klasy, więc jeśli w przyszłości będziesz musiał zmienić sposób obliczania lub pobierania tych wartości bez zmiany interfejsu API, będzie to znacznie prostsze. Że coś będzie wyglądać następująco:

class DeviceInfo 
{ 
    protected $c_devices; 
    protected $c_active; 
    protected $c_inactive; 
    protected $c_offline; 

    public function get_c_devices() { 
     return $this->c_devices; 
    } 

    public function get_c_active() { 
     return $this->c_active; 
    } 

    public function get_c_inactive() { 
     return $this->c_inactive; 
    } 

    public function get_c_offline() { 
     return $this->c_offline; 
    } 

    public function __construct($cpe_mac) { 

     $count_device = VSE::count_device($cpe_mac); 

     $this->c_devices = $count_device['Count_of_devices']; 
     $this->c_active = $count_device['Count_of_active']; 
     $this->c_inactive = $count_device['Count_of_inactive']; 
     $this->c_offline = $count_device['Count_of_offline']; 
    } 
} 

Jedyną różnicą jest to, że teraz, aby uzyskać wartości chcesz wywoływać funkcje zamiast bezpośredniego dostępu do właściwości tak:

$deviceInfo = new DeviceInfo($cpe_mac); 
$deviceInfo->get_c_devices(); // returns devices 

Na przykład to proste, dodatkowy kod może nie być tego wart, ale to ułatwia aktualizację tego kodu w przyszłości bez zrywania wszystkich punktów, które te funkcje są wywoływane w pozostałej części aplikacji.

4

Jeśli nie chcesz zmieniać żadnych zmiennych na swojej stronie i jesteś potencjalnie myślenia na temat korzystania z funkcji globalnej możesz:

function get_device_info($cpe_mac) 
{ 
    $count_device = VSE::count_device($cpe_mac); 

    return [ 
     'c_devices' => $count_device['Count_of_devices'], 
     'c_active' => $count_device['Count_of_active'], 
     'c_inactive' => $count_device['Count_of_inactive'], 
     'c_offline' => $count_device['Count_of_offline'], 
    ]; 

} 

Wtedy można by nazwać:

extract(get_device_info($someVar)); 

i chcesz mieć dostęp do:

$c_devices; 
$c_active; 
$c_inactive; 
$c_offline; 

jak zawsze zrobili

Proszę zauważyć, że nie mówię, że to jest lepsza odpowiedź niż inne dostarczone, po prostu mówię, że to alternatywa.

Mam nadzieję, że to pomoże!

+0

Chciałbym dodać, że jeśli chce zmienić swoje zmienne, wszystko, co trzeba zmienić, to zastąpienie 'extract (get_device_info ($ someVar))' '$ info = get_device_info ($ someVar);' i użycie ' $ info ['c_devices'] ',' $ info ['c_active'] '(...) zamiast' $ c_devices', '$ c_active' (...) –

+1

To jest świetne rozwiązanie, jeśli nie masz chcesz zmienić wiele istniejącego kodu. –