PHP: callback ფსევდო ტიპი

PHP – ში არსებობს ე.წ. ფესევდო ტიპის ცნება. ფსევდო ტიპები რამდენიმეა და ერთერთი ყველაზე საინტერესო მათ შორის არის callback ფსევდო ტიპი.

ცნობილია რომ ამ ენაში, მთელ რიგ ფუნქციებს შესაძლებელია callback პარამეტრები გადავცეთ, რომელიც უმეტეს შემთხვევაში წარმოადგენს ჩვეულებრივ PHP ფუნქციის(ან თავად ენაში არსებული, ან ჩვენს მიერ შექმნილი) სახელს. თუმცა დოკუმენტაციაში მითითებულია რომ გარდა ფუნქციებისა შესაძლებელია გადავცეთ ასევე კლასის როგორც სტატიკური ასევე არასტატიკური მეთოდები.

როგორ გადავცეთ ფუნქციას კლასის მეთოდი callback პარამეტრად? ამის გაკეთება ძლიან მარტივია, ამისათვის საკმარისია გამოვიყენოთ ჩვეულებრივი მასივია (array) და ფუნქციას პარამეტრი გადავცეთ შემდეგი სახით:

//კლასის სტატიკური მეთოდის გამოძახების შემთხვევაში
array('ClassName', 'methodName')

//კლასის არა სტატიკური მეთოდის გამოძახების შემთხვევაში
array(new ClassName(), 'methodName');

ეს მიიღწევა მასივის მეშვეობით. მასივის პირველი ელემენტი არის კლასის სახელი თუ გვესაჭიროება სტატიკური მეთოდის გამოძახება, ან კლასის ობიექტი თუ გვსურს არასტატიკური მეთოდის გამოძახება. ყველაფერი ძალიან მარტივია.

თუმცა PHP5 – ში, მეთოდებთან private წვდომის მოდიფიკატორის გამოყენების საშუალება არსებობს, ეს ძალიან სასარგებლოა ხშირ შემთხვევაში რადგან კლასის ინტერფეისისათვის ყოვლად უსარგებლო მეთოდებს მთლიანად ვმალავთ მომხმარებლისათვის. რა ხდება ასეთ დროს როდესაც ვცდილობთ კლასის private მეთოდის გამოყენებას callback პარამეტრის შემთხვევაში?

ჩემდა გასაოცრად, ძალიან სასარგებლო რამ აღმოვაჩინე რაც არ არის დოკუმენტაციაშია მითითებული, თუმცა ეს შესაძლებელი ყოფილა. იმ შემთხვევაში თუ კლასის რომელიმე მეთოდიდან შევეცდებით იმავე კლასის private მეთოდის გამოყენებას(არ აქვს მნიშვნელობა მეთოდი სტატიკურია თუ არა) callback პარამეტრისათვის კოდი იმუშავებს, რადგან როგორც მივხვდი კლასის კონტექსტის უგულებელყოფა არ ხდება და კოდი მთლიანად სრულდება მიმდინარე კლასის კონტექსტში.

მაგალითად:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class CallBackTest {
   
    //სტატიკური private მეთოდი რომელიც სტრიქონს გადაიყვანს ქვედა რეგისტრში
    private static function testStaticPrivateMethod($param) {
        return strtolower($param);
    }
   
    //ობიექტის private მეთოდი რომელიც სტრიქონს გადაიყვანს ზედა რეგისტრში
    private function testInstanceMethod($param) {
        return strtoupper($param);
    }
   
    //მასივის გამოსაბეჭდი დამხმარე მეთოდი
    private static function pre($arr) {
        echo '<pre>';
        print_r($arr);
        echo '</pre>';
    }
   
    //public მეთოდი, სტატიკური private testStaticPrivateMethod მეთოდის მუშაობის ტესტირებისათვის
    public static function staticTest() {
       
        $input = array(
            'Test Value1',
            'Value Test',
            'Test TEST, TeSt'
        );
       
        //callback პარამეტრს გადავცემთ მასივის სახით,
        //რომლის პირველი ელემენტი არის self რომელიც მიუთითებს კლასის სტატიკურ კონტექსტს
        $r1 = array_map(array('self', 'testStaticPrivateMethod'), $input);

        //მასივის გამობეჭდვა
        self::pre($r1);        


        //ამ შემთხვევაში ასევე დასაშვებია ქვემოთ მითითებული კონსტრუქციის გამოყენება
        //სადაც self - ის ნაცვლად ვუთითებთ პირდაპირ კლასის სახელს
        //$r1 = array_map(array('CallBackTest', 'testStaticPrivateMethod'), $input);
       
       
    }
   
    //public მეთოდი, არასტატიკური private testInstanceMethod მეთოდის მუშაობის ტესტირებისათვის
    public function instanceTest() {
       
        $input = array(
            'Test Value1',
            'Value Test',
            'Test TEST, TeSt'
        );
       
        //callback პარამეტრს გადავცემთ მასივის სახით, რომლის პირველი ელემენტი არის მიმდინარე კლასის ობიექტი
        $r2 = array_map(array($this, 'testInstanceMethod'), $input);
       
        //მასივის გამობეჭდვა
        self::pre($r2);
       
    }
   
}

//სტატიკური სატესტო მეთოდის გამოძახება
CallBackTest::staticTest();

//კლასის ობიექტის ინსტანციაცია
$o = new CallBackTest();
//ობიექტის სატესტო მეთოდის გამოძახება
$o->instanceTest();

კოდის შესრულების შედეგი CallBackTest::staticTest() გამოძახებისათვის იქნება:

Array
(
    [0] => test value1
    [1] => value test
    [2] => test test, test
)

მასივის ყველა მნიშვნელობა გადაყვანილია ქვედა რეგისტრში, ეს ნიშნავს იმას რომ private სტატიკურმა მეთოდმა იმუშავა.

ხოლოდ შედეგი $o->instanceTest() გამოძახებისათვის იქნება:

Array
(
    [0] => TEST VALUE1
    [1] => VALUE TEST
    [2] => TEST TEST, TEST
)

მასივის ყველა მნიშვნელობა გადაყვანილია ზედა რეგისტრში, ეს ნიშნავს იმას რომ ობიექტის private მეთოდმა იმუშავა.

კოდის კომენტარებიდან ნათლად ჩანს თუ როგორ მუშაობს კოდი, თუმცა ყურადღებას შევაჩერებ private სტატიკური მეთოდის გამოძახებაზე. testStaticPrivateMethod – ში, callback – ის გადაცემისას გამოყენებულია self მიმთითებელი რომელიც გაჩნდა PHP5 – ში, და სტატიკურ წევრებთან წვდომის უფრო ბუნებრივ საშუალებას გვაძლევს. სწორედ self იქნა გამოყენებული მაგალითში თუმცა ასევე დასაშვები იყო პირდაპირ კლასის სახელის მითითებაც. ნებისმიერ შემთხვევაში კოდის შესრულების შედეგი იქნებოდა ერთნაირი. მაგრამ ყველაზე მნიშნველოვანი არის ის რომ callback პარამეტრების გამოყენების დროს არ არის აუცილებელი რომ საჭირო მეთოდები ავღწეროთ როგორც public, რადგან ამ დროს კლასის კონტექსტის უგულებელყოფა არ ხდება. ეს კი ძალიან დადებითი დეტალია რადგან ერთის მხრივ არ ვიზღუდებით ამ შესაბამისი ფსევდო ტიპის გამოყენებაში, მეორეს მხრივ კი არ არის საჭირო კლასის დიზაინის დარღვევა და გარესამყაროსთვის არასაჭირო მეთოდების როგორც public წევრების აღწერა.

ტეგები:

დატოვე კომენტარი:

ქართული კლავიატურა, ჩართვა/გამორთვა კლავიშით "~"