PHP-ში რა ჯადოსნური მეთოდები არსებობს და როგორ გამოიყენება ისინი?
sobes.tech AI
პასუხი AI-სგან
მაგიური მეთოდები PHP-ში - ეს სპეციალური მეთოდებია, რომლებიც იწყება ორმაგი ხაზით (მაგალითად, __construct), რომლებიც ავტომატურად იძახება გარკვეულ სიტუაციებში.
ძირითადი მაგიური მეთოდები და მათი გამოყენება:
-
__construct(): იძახება კლასის ობიექტის შექმნისას. გამოიყენება ობიექტის თვისებების ინიციალიზაციისა და საწყის მოქმედებების შესასრულებლად.<?php class MyClass { public function __construct() { echo "ობიექტი შექმნილია!"; } } $obj = new MyClass(); // გამოიტანს "ობიექტი შექმნილია!" -
__destruct(): იძახება ობიექტის განადგურებისას (მაგალითად, როდესაც სკრიპტი დასრულდება ან ობიექტი წაიშლება მეხსიერებიდან). გამოიყენება რესურსების გათავისუფლებისთვის (ფაილების დახურვა, ბაზის კავშირების დახურვა).<?php class MyClass { public function __destruct() { echo "ობიექტი განადგურდა!"; } } $obj = new MyClass(); unset($obj); // გამოიტანს "ობიექტი განადგურდა!" -
__call(string $name, array $arguments): იძახება, როდესაც ცდილობენ დაუკავშირდნენ მიუწვდომელ ან არარსებულ მეთოდს ობიექტის კონტექსტში.$nameშეიცავს მეთოდის სახელს, ხოლო$arguments- არგუმენტების მასივს.<?php class MyClass { public function __call($name, $arguments) { echo "დაუკავშირდა მიუწვდომელ მეთოდს '{$name}' არგუმენტებით: " . implode(', ', $arguments); } } $obj = new MyClass(); $obj->nonExistentMethod('arg1', 'arg2'); // გამოიტანს "დაუკავშირდა მიუწვდომელ მეთოდს 'nonExistentMethod' არგუმენტებით: arg1, arg2" -
__callStatic(string $name, array $arguments): იძახება, როდესაც ცდილობენ დაუკავშირდნენ მიუწვდომელ ან არარსებულ სტატიკურ მეთოდს კლასის კონტექსტში. ანალოგიურია__call, მაგრამ სტატიკური გამოძახებისთვის.<?php class MyClass { public static function __callStatic($name, $arguments) { echo "დაუკავშირდა მიუწვდომელ სტატიკურ მეთოდს '{$name}' არგუმენტებით: " . implode(', ', $arguments); } } MyClass::nonExistentStaticMethod('static_arg'); // გამოიტანს "დაუკავშირდა მიუწვდომელ სტატიკურ მეთოდს 'nonExistentStaticMethod' არგუმენტებით: static_arg" -
__get(string $name): იძახება, როდესაც ცდილობენ მიუწვდომელ ან არარსებულ თვისებას მიიღონ მნიშვნელობა ობიექტის კონტექსტში.$nameშეიცავს თვისების სახელს.<?php class MyClass { private $data = ['key' => 'value']; public function __get($name) { if (array_key_exists($name, $this->data)) { return $this->data[$name]; } return null; } } $obj = new MyClass(); echo $obj->key; // გამოიტანს "value" echo $obj->nonExistentKey; // გამოიტანს ცარიელ სტრიქონს (შესაბამისად, null-ის დაბრუნებით) -
__set(string $name, mixed $value): იძახება, როდესაც ცდილობენ მიუწვდომელ ან არარსებულ თვისებას დაყენებულ მნიშვნელობას მისცენ.$nameშეიცავს თვისების სახელს, ხოლო$value- დაყენებული მნიშვნელობა.<?php class MyClass { private $data = []; public function __set($name, $value) { $this->data[$name] = $value; } public function getData() { return $this->data; } } $obj = new MyClass(); $obj->newKey = 'newValue'; print_r($obj->getData()); // გამოიტანს Array ( [newKey] => newValue ) -
__isset(string $name): იძახება, როდესაც გამოიყენებაisset()ანempty()მიუწვდომელ ან არარსებულ თვისებაზე ობიექტის კონტექსტში. აბრუნებს ბულეურ მნიშვნელობას.<?php class MyClass { private $data = ['present' => 'value']; public function __isset($name) { return array_key_exists($name, $this->data); } } $obj = new MyClass(); var_dump(isset($obj->present)); // გამოიტანს bool(true) var_dump(isset($obj->absent)); // გამოიტანს bool(false) -
__unset(string $name): იძახება, როდესაც გამოიყენებაunset()მიუწვდომელ ან არარსებულ თვისებაზე ობიექტის კონტექსტში.<?php class MyClass { private $data = ['remove_me' => 'value_to_remove']; public function __unset($name) { if (array_key_exists($name, $this->data)) { unset($this->data[$name]); echo "თვისება '{$name}' წაიშალა.\n"; } } public function getData() { return $this->data; } } $obj = new MyClass(); print_r($obj->getData()); unset($obj->remove_me); // გამოიტანს "თვისება 'remove_me' წაიშალა." და წაშლის ელემენტს $data-დან print_r($obj->getData()); -
__sleep(): იძახება, როდესაც ობიექტი სერიულიალიზდებაserialize()-ით. უნდა დააბრუნოს თვისებების სახელების მასივი, რომლებიც სერიულიალიზდება.<?php class MyClass { public $prop1 = 'value1'; public $prop2 = 'value2'; public function __sleep() { return ['prop1']; // სერიულიალიზდება მხოლოდ prop1 } } $obj = new MyClass(); $serialized = serialize($obj); // სერიულიალიზდება მხოლოდ prop1 echo $serialized; // გამოიტანს დაახლოებით O:7:"MyClass":1:{s:5:"prop1";s:6:"value1";} -
__wakeup(): იძახება, როდესაც ობიექტი დესერიულიალიზდებაunserialize()-ით. გამოიყენება კავშირების აღდგენის ან სხვა მოქმედებების შესასრულებლად, რომლებიც საჭიროა ობიექტის აღდგენის შემდეგ.<?php class MyClass { public $prop1; public $resource; // განვიხილოთ, როგორც კავშირის რესურსი public function __wakeup() { // აღადგინოს რესურსი, მაგალითად, ბაზასთან კავშირი $this->resource = fopen('/tmp/my_file.txt', 'w'); // მაგალითი echo "ობიექტი გააღვიძა და რესურსი აღდგა!\n"; } public function __sleep() { // __sleep-ში რესურსს არ სერიულიალიზება return ['prop1']; } public function __destruct() { if (is_resource($this->resource)) { fclose($this->resource); echo "რესურსი დახურულია.\n"; } } } $obj = new MyClass(); $obj->prop1 = 'deserialized value'; $serialized = serialize($obj); unset($obj); $deserialized_obj = unserialize($serialized); // გამოიძახება __wakeup() var_dump($deserialized_obj->prop1); -
__toString(): იძახება, როდესაც ობიექტი გამოიყენება როგორც სტრიქონი (მაგალითად,echoან კონკატენაცია). უნდა დააბრუნოს ობიექტის სტრიქონური წარმოდგენა.<?php class MyClass { public $name = "MyObject"; public function __toString() { return "ობიექტი ტიპის MyClass სახელით: " . $this->name; } } $obj = new MyClass(); echo $obj; // გამოიტანს "ობიექტი ტიპის MyClass სახელით: MyObject" -
__invoke(...): იძახება, როდესაც ცდილობენ ობიექტს გამოიძახონ როგორც ფუნქცია. შეიძლება მიიღოს ნებისმიერი რაოდენობის არგუმენტები.<?php class MyCallableClass { public function __invoke(...$args) { echo "ობიექტი გამოიძახა როგორც ფუნქცია არგუმენტებით: " . implode(', ', $args); } } $obj = new MyCallableClass(); $obj('arg1', 123); // გამოიტანს "ობიექტი გამოიძახა როგორც ფუნქცია არგუმენტებით: arg1, 123" -
__set_state(array $properties): იძახება სტატიკურად, როდესაც კლასი ექსპორტირებულიაvar_export()-ით. იღებს ექსპორტირებული თვისებების მასივს. უნდა შექმნას ახალი კლასის ობიექტი და დააბრუნოს იგი.<?php class MyClass { public $prop; public static function __set_state(array $properties) { $obj = new MyClass(); $obj->prop = $properties['prop']; return $obj; } } $obj = new MyClass(); $obj->prop = 'exported value'; $exported = var_export($obj, true); // ექსპორტირებს ობიექტს // $exported შეიცავს კოდს, რომელიც ქმნის ობიექტს, __set_state()-ს გამოყენებით eval('$restored_obj = ' . $exported . ';'); var_dump($restored_obj); // გამოიტანს ობიექტს MyClass და prop-ით 'exported value' -
__debugInfo(): იძახება, როდესაც ფუნქციებსvar_dump()იყენებენ ობიექტზე. მეთოდი უნდა დააბრუნოს მასივი, რომელიც შეიცავს ობიექტის თვისებებს, რომლებიც უნდა გამოჩნდეს.<?php class MyClass { public $publicProp = 'public'; private $privateProp = 'private'; public function __debugInfo() { return ['publicProp' => $this->publicProp, 'private_info' => 'რაიმე დეტალები privateProp-ის შესახებ']; } } $obj = new MyClass(); var_dump($obj); // გამოიტანს __debugInfo()-დან დაბრუნებულ ინფორმაციას -
__clone(): იძახება, როდესაც ხდება ობიექტის კლონირება (clone). გამოიყენება შერწყმული ობიექტების ან მონაცემთა სტრუქტურების ღრმად კოპირებისათვის.<?php class SubObject { public $value; public function __construct($value) { $this->value = $value; } } class MyClass { public $object; public $anotherProp; public function __construct() { $this->object = new SubObject('initial'); $this->anotherProp = 'original'; } public function __clone() { // შერწყმული ობიექტის კლონირება ღრმად კოპირებისათვის $this->object = clone $this->object; } } $obj = new MyClass(); $cloned_obj = clone $obj; // ახლა $obj->object და $cloned_obj->object - სხვადასხვა მაგალითებია SubObject-ის $cloned_obj->object->value = 'modified'; var_dump($obj->object->value); // გამოიტანს "initial" var_dump($cloned_obj->object->value); // გამოიტანს "modified"
მოკლე სია მეთოდების შესახებ:
| მეთოდი | აღწერა | იძახება როდესაც... |
|---|---|---|
__construct() |
კონსტრუქტორი კლასი. | ახალი კლასის მაგალითის შექმნისას. |
__destruct() |
დესტრუქტორი კლასი. | ობიექტის წაშლის ან სკრიპტის დასრულებისას. |
__call() |
მიუწვდომელ/არარსებულ მეთოდზე ზარის დამუშავება. | მიუწვდომელ ან არარსებულ მეთოდზე ზარის მცდელობისას. |
__callStatic() |
მიუწვდომელ/არარსებულ სტატიკურ მეთოდზე ზარის დამუშავება. | მიუწვდომელ ან არარსებულ სტატიკურ მეთოდზე ზარის მცდელობისას. |
__get() |
მიუწვდომელ/არარსებულ თვისებაზე მნიშვნელობის მიღება. | მიუწვდომელ ან არარსებულ თვისებაზე მნიშვნელობის მიღებისას. |
__set() |
მიუწვდომელ/არარსებულ თვისებაზე მნიშვნელობის დაყენება. | მიუწვდომელ ან არარსებულ თვისებაზე მნიშვნელობის დაყენებისას. |
__isset() |
isset() ან empty()-ის გამოყენება თვისებებზე. |
მიუწვდომელ ან არარსებულ თვისებაზე isset() ან empty()-ის გამოყენებისას. |
__unset() |
მიუწვდომელ/არარსებულ თვისებაზე unset()-ის გამოყენება. |
მიუწვდომელ ან არარსებულ თვისებაზე unset()-ის გამოყენებისას. |
__sleep() |
სერიულიალიზაციისთვის მომზადება. | serialize()-ის გამოყენება ობიექტზე. |
__wakeup() |
დესერიულიალიზაციის შემდეგ დამუშავება. | unserialize()-ის გამოყენება ობიექტზე. |
__toString() |
ობიექტის სტრიქონური წარმოდგენა. | როდესაც ობიექტი გამოიყენება როგორც სტრიქონი (მაგალითად, echo). |
__invoke() |
ობიექტის გამოძახება როგორც ფუნქცია. | როდესაც ცდილობენ ობიექტის გამოძახებას როგორც ფუნქცია. |
__set_state() |
ობიექტის შექმნა var_export()-ის შემდეგ. |
კოდის შეფასებისას, რომელიც შექმნილია var_export(). |
__debugInfo() |
ინფორმაცია დებაგისთვის (var_dump()). |
როდესაც var_dump()-ს იყენებენ ობიექტზე. |
__clone() |
კლონირების შემდეგ დამუშავება. | clone-ის გამოყენებისას. |