შესაძლებელია თუ არა ამ საჭირო პატერნის რეალიზაცია PHP4 – ში? მიუხედავად იმისა რომ უმრავი რამ არის ნათქვამი PHP-ს ამ ვერსიის არასრულფასოვან ობიექტზე ორიენტირებულ შესაძლებლობებზე – ეს შესაძლებელია თუმცა გარკვეულწილად ეს არის ხელოვნური და შედარებით რთული გზა ვიდრე PHP5-სა და Java-ში. (დეტალურად ამ პატერნის შესახებ შეგიძლიათ წაიკითხოთ ამ პოსტში).
რითია ეს სირთულე გამოწვეული ეს სირთულე PHP4 – ში? ამის რამდენიმე მიზეზია რომელსაც ჩამოვთვლილია ქვევით:
- არ არსებობს წვდომის მოდიფიკატორები(public, protected, private) კლასის ცვლადებისა და მეთოდებისათვის.
- არ არსებობს სტატიკური (static) კლასის ცვლადები.
სწორედ ზემოთაღნიშნული მიზეზები ღდის ამ პატერნის რეალიზაციას ხელოვნურს, თუმცა მისი გამოყენება მაინც შესაძლებელია.
განვიხილოთ მაგალითი:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Singleton { //private constructor function Singleton() {} function &getInstance() { static $singleton = array(); if (!$singleton) { $singleton[0] = &new Singleton(); } return $singleton[0]; } } |
თუმცა PH5 – სთვის საქმე გაცილებით უკეთ არის და მისი რეალიზაცია თითქმის იდენტურია Java-ს რეალიზაციისა.
მაგალითი PHP5 – სთვის:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Singleton { static private $instance = null; //private constructor private function __construct() { } public static function getInstance() { if (self::$instance == null) { self::$instance = new Singleton(); } return self::$instance; } } |
მოცემულ კოდში განსხვავებით პირველი მაგალითისგან თვალში გხვდება რამოდენიმე ახალი საკვანძო სიტყვა:
- static – გამოიყენება როგორც კლასის ცვლადის ასევე კლასის მეთოდთან.
- public, private – წვდომის მოდიფიკატორები რომლებიც მანამდე არ არსებობდა PHP – ში.
- _counstruct - PHP5 – ში კონსტრუქტორის სახელი (კლასის სახელი გამოყენება წინა ვერსიაში ავტომატურად გულისხმობდა რომე ეს ფუნქცია იყო კონსტრუქტორი)
- self – ეს საკვანძო სიტყვა გულისხმობს მიმდინარე კლასს, მხოლოდ სტატიკურ კონტექსტში.
ტეგები: Design Patterns, PHP