PHP კლასის კონსტრუქტორი

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

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

მაგალითად ჯავაში როდესაც ვქმნით კლასის ობიექტს მისი კონსტრუქტორის გამოძახებით, უშუალოდ ამ კონსტრუქტორის შიგნით არსებული კოდის შესრულებამდე პირველ რიგში იძახება ან მშობელი კლასის კონსტრუქტორი ან იმავე კლასის სხვა კონსტრუქტორი ავტომატურად ან ცხადად. PHP – ში კი მშობელი კლასის კონსტრუქტორის არავითარი ავტომატური გამოძახება არ არსებობს, თუ გვჭირდება იერარქიის სრული ინიციალიზაცია ამისათვის ცხადად უნდა გამოვიძახოთ მემკვიდრე კლასის კონსტრუქტორებიდან მშობელი კლასის კონსტრუქტორები.

მაგალითად შემდეგი კოდი არის აღწერილი შემთხვევის ნიმუში:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Parent {
 
  function Parent() {
    echo 'initializing parent';
  }
 
}

class Child extends Parent {
 
  function Child() {
    parent::Parent();
    echo '<br />initializing child';
  }
 
}

new Child();

მემკვიდრე კლასიდან ცხადად ვიძახებთ მშობელი კლასის კონსტრუქტორს parent::Parent();. თუ მსგავსად არ იქნება გამოძახებული მშობელი კლასის კონსტრუქტორი იგი არასოდეს არ შესრულდება რამაც შესაძლებელია გარკვეული პრობლემები წარმოქმნას. თუმცა როგორც შემთხვევით აღმოვაჩინე (რამაც დამაბნია და გარკვეული დრო დამაკარგვინა სანამ მივხვდი :D ) თუ მემკვიდრე კლასსში საერთოდ არ განვსაზღვრავთ კონსტრუქტორს მშობელი კლასის კონსტრუქტორის გამოძახება მოხდება ავტომატურად…

მაგალითად შემდეგ მაგალითში ნაჩვენებია ანალოგიური შემთხვევა:

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
class Item {
 
  var $name;
 
  function Item($name) {
    $this->name = $name;
  }
 
}

class Parent {
 
  //class variable
  var $item;
 
  /**
   * Parent class constructor
   * @param Item $item
   */

  function Parent(&$item) {
    $this->item = &$item;
  }
 
  //abstract method
  function doSomething() {
    die('method is not implemented');
  }
 
}

class Child extends Parent {
 
  //overrided method
  function doSomething() {
    echo 'Implemented in ' . $this->item->name;
  }
 
}

$o = &new Child(new Item('test item'));
$o->doSomething();

კოდის შესრულების შედეგია:

Implemented in test item

მიუხედავად იმისა რომ Child კლასში არ გვაქვს განსაზღვრული კონსტრუქტორი new Child(new Item(‘test item’)) გამოსახულების შესრულებით იძახება მშობელი(Parent) კლასის კონსტრუქტორი რომელიც პარამეტრად ღებულობს Item ტიპის ობიექტს. ხოლო შემდგომ doSomething() მეთოდში ხდება სწორედ Parent კონსტრუქტორისთვის პარამეტრად გადაცემული Item ობიექტის გამოყენება. აქედან დასკვნა:


თუ მემკვიდრე კლასში არ არის განსაზღვული კონსტრუქტორი, ეს ნიშნავს რომ ამ კლასის ობიექტის შექმნისას აუცილებლად გამოძახებული იქნება მშობელი კლასის კონსტრუქტორი.

უფრო მეტიც, მაგალითად თუ შევასრულებთ ასეთ კოდს: new Child() მაშინ PHP გამოგვიტანს შემდეგ გაფრთხილებას Warning: Missing argument 1 for parent()

ტეგები:

3 Responses to “PHP კლასის კონსტრუქტორი”

  1. აჩრდილი says:

    http://www.php.net/manual/en/language.oop5.decon.php
    ეგ დოკუმენტირებულიც არის :)
    ისე გეთანხმები, ცოტა უცნაურია რატომ გააკეთეს ასე :)

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

    მაგ მომენტმა დამაბნია ზუსტად, რომ კლასში კონსტრუქტორი გამომრჩა და მისი ობიექტის შექმნის დროს სუპერ კლასის კონსტრუქტორის გამოძახება მოხდა, თანაც პარამეტრიზებული კონსტრუქტორი იყო.

    ჯავაში სუპერ კლასის კონსტრუქტორის გამოძახების კოდს თუ არ ვწერთ მაგ საკითხზე კომპილატორი ზრუნავს და ჩვენს მაგივრად ჩასვავს სუპერ კლასის უპარამეტრო კონსტრუქტორის გამოძახების კოდს, ამიტომ არ გამიკვირვებია PHPში რატომ იყო საჭირო საჭიროების შემთხვევაში მაგ კოდის წერა, მანდ ხომ არაფერი კომპილირდება :)

  3. bekalius says:

    gamarjobat kai programisti minda dasaxmareblad da tu vinmes gaqvt survili chems proeqtebshi daxmareba gamiciot bekalius@avoe.ge am emailze momceret tqveni romelime messengeri da roca ragac kitxva mekneba daxmareba gamiciet

    didi madloba cinascar

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

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