Бид Php -н обьект хандалтад программчлалын талаар өмнөх хичээлүүдэд үзсэн. Ямар нэгэн зүйлийг сурч эзэмших хамгийн сайн арга бол онолын мэдлэгээс гадна практик ажилд ашиглах явдал байдаг. Иймд бид энэ хичээлээр ОХП -ын дадлагын ажлыг хийх болно.
Нэгдүгээр даалгавар
- name, login, password шинжүүдтэй Users классыг үүсгэ
- Users классаас 3 обьект үүсгэнэ
- Обьект бүрийн шинжүүдэд дурын утгуудыг олго.
Даалгавар маш энгийн учраас Класс ба обьект хичээлийг үзээд өөрөө хийх гээд оролдоод үзээрэй. Өмнөх хичээлүүдийн материалыг сан ойлгосон бол энэхүү даалгавар танд ямар нэгэн хүндрэл үүсгэх ёсгүй. Бүр дийлэхгүй байгаа бол даалгаварын шийдлийг харцгаая.
<?php
class Users{
public $name;
public $login;
public $password;
}
$user1 = new Users();
$user1->name = "Бат";
$user1->login = "bataa";
$user1->password = 123;
$user2 = new Users();
$user2->name = "Дорж";
$user2->login = "dorj";
$user2->password = 321;
$user3 = new Users();
$user3->name = "Солонго";
$user3->login = "soko";
$user3->password = 456;
?>
Эхний даалгаварын шийдэл бол ердөө л энэ юм. Класст шинж ба арга гэсэн хоёр зүйл байдгийг бид мэднэ. Дээрх даалгавараар бид шинжийг үүсгээд түүнд утгуудыг олгохыг хийсэн. Одоо аргыг арай дэлгэрүүлэн авч үзье. Маш энгийнээр хэлбэл энэ бол обьектын үйлдлүүд. Машин гэсэн обьектыг аваад үзье. Машин урагшаа, зүүн, баруун, ухрах хөдөлгөөнийг хийж болохоос гадна тодорхой хэмжээний хурдыг авч болно. Энэ бүгд бол аргууд буюу тухайн обьектын хийж чадах үйлдлүүд. Тэгвэл бид ОХП-аар обьектын боломжуудыг /аргууд/ хэрхэн бичих вэ?
Арга гэдэг бол зүгээр л функцууд. Тэдгээр нь ердийн функцуудын адилаар л тодорхойлогдоно.
Программын кодын хаа нэгэн хэсэгт бичигдсэн функцууд бол ердийн функцууд. Харин классын дотор тодорхойлогдсон функцууд бол түүний аргууд. Үүнийг тогтоогоод аваарай.
Аргыг хэрхэн тодорхойлохыг жишээн дээр аваад үзье. Жишээ болгоод "машин" гэсэн классыг авъя. Класст "машин" обьектын шинжүүдийг тодорхойлохоос гадна хамгийн энгийн аргыг тодорхойлон өгье. Аргыг takeSpeed() гэж нэрлэе. Бүхий л арга болон шинжүүдийг public (нээлттэй), protected (хамгаалагдсан), private (хаалттай) байдлаар зарлах боломжтой гэдгийг бид "Арга ба шинжүүдэд хандах" хичээлд үзсэн. Арга шинжүүдийг зарлахдаа хандах хязгаарлалтыг заагаагүй бол түүнийг public (нээлттэй) гэж үздэг. Та эхнээсээ арга шинжүүдийг тодорхойлохдоо хандалтын хязгаарлалтыг тавин өгч сурах нь дээр гэдгийг сануулъя. Ингээд код нь
<?php
// классын тодорхойлолт
class Car{
// шинжүүд
public $year = 2010;
public $speed;
public $model;
// аргыг үүсгэх
public function takeSpeed(){
// энд арга ямар нэгэн үйлдэл хийнэ
return "Машины хурд = ";
}
}
// объектыг үүсгэх
$car1 = new Car();
// аргад хандах
echo $car1->takeSpeed();
$car2 = new Car();
?>
Аргад хандах нь шинжид хандахын нэгэн ижил гэдэг нь жишээн дээрээс харагдана. жишээ нь $car1->takeSpeed() нь car1 обьектын takeSpeed аргад хандахыг зааж байгаа юм. Хэрвээ дээрх кодыг ажлуулбал манай арга дэлгэц дээр "Машины хурд = " гэсэн үгийг үзүүлэх болно. Эндээс л хамгийн сонирхолтой зүйл эхлэж байгаа юм. Бид ямар машины хурдыг авахыг хүссэн вэ? гэдгийг та анхаарсан байх. Логикоор бол бид классын car1 хувиас хандсан болохоор энэ машины хурдыг авах гэсэн гэж бодогдоно. Гэтэл машины хурдыг авах аргад бидэнд яг ямар обьектын хурдыг авах талаар заагаагүй байдаг. Энэ тохиолдолд бид Car классын speed шинжид хандах шаардлагатай. Гэтэл шинж нэг харин машин (обьект) хоёр байгаад байдаг. Иймээс бид чухам ямар обьектын шинжийг (хурд) сонирхож байгаагаа аргад заан өгөх хэрэгтэй.
Обьект хандалтад программчлалын ийм заагч бол $this түлхүүр үг бөгөөд $this->speed гэж бичин өгнө.
Түлхүүр үгийг ашиглан дээрх кодыг өөрчлөн бичвэл
<?php
// классын тодорхойлолт
class Car{
// шинжүүд
public $year = 2010;
public $speed;
public $model;
// арга
public function takeSpeed(){
// аргад аль хурдыг авахыг заан өгнө
return "Машины хурд = ".$this->speed;
}
}
// объектыг үүсгэх
$car1 = new Car();
$car1->speed = 210; // объектын шинжид утга олгох
$car1->model = "bmw"; // объектын шинжид утга олгох
// аргад хандах
echo $car1->takeSpeed()."<br>";
$car2 = new Car();
$car2->speed = 260;// объектын шинжид утга олгох
$car2->model = "lexus"; // объектын шинжид утга олгох
// аргад хандах
echo $car2->takeSpeed();
?>
Жишээнд car1 обьектын model шинжид bmw харин car2 обьектын model шинжид lexus утгуудыг өгөн эдгээр модел бүрийн хурдны шинжид утга олгосон. Программыг ажиллуулбал дэлгэц дээр
Машины хурд = 210
Машины хурд = 260
гэж үзүүлэх болно. Классын аргад $this түлхүүр үгийг ашигласнаар обьект тус бүрийн хурдыг үзүүлж чадлаа. $this түлхүүр үг нь тухайн үед ажиллаж байгаа обьектыг л заах болно. Энэ тухай бид өмнө нь бас үзсэн. Одоо та түлхүүр үгийн учрыг сайн ойлгосон байх.
Арга дотроос шинжид хандахдаа $this түлхүүр үгээр дамжин хандана гэдгийг л тогтоон аваарай.
Бас нэгэн чухал зүйлийн талаар. car класст takeSpeed() аргаас гадна paintSpeed() гэсэн арга байлаа гэж бодъё. Бид paintSpeed() аргаар машины хурдыг үзүүлэх харин takeSpeed() арга нь paintSpeed() аргыг дуудах байдлаар хийцгээе. Энэ нь нэг аргаас нөгөө аргад хандахдаа бас л $this түлхүүр үгийг ашигладаг гэдгийг үзүүлсэн жишээ юм.
<?php
// классын тодорхойлолт
class Car{
// шинжүүд
public $year = 2010;
public $speed;
public $model;
// арга
public function takeSpeed(){
// takeSpeed() аргаас paintSpeed() аргад хандах
return $this->paintSpeed();
}
// арга
function paintSpeed(){
// аргад аль хурдыг авахыг заан өгнө. Аргаас шинжид хандах
return "Машины хурд = ".$this->speed;
}
}
// объектыг үүсгэх
$car1 = new Car();
$car1->speed = 210; // объектын шинжид утга олгох
$car1->model = "bmw"; // объектын шинжид утга олгох
// аргад хандах
echo $car1->takeSpeed()."<br>";
$car2 = new Car();
$car2->speed = 260;// объектын шинжид утга олгох
$car2->model = "lexus"; // объектын шинжид утга олгох
// аргад хандах
echo $car2->takeSpeed();
?>
Код өмнөхтэй яг адилхан үр дүнг буцаана. Эндээс дүгнэвэл:
Аргаас аргад, аргаас шинжид хандахдаа $this түлхүүр үгээр дамжуулан хандана. Үүнийг ойлгох нь техникийн нарийн асуудал тул зүгээр л тогтоогоод аваарай.
За одоо дадлагын ажилдаа эргэн ороод хоёрдугаар даалгаварыг гүйцэтгэе.
Хоёрдугаар даалгавар
- Users класст getInfo() аргыг тодорхойлон өг
- getInfo() арга нь обьектын шинжүүдийг үзүүлнэ
- Обьект бүрээс getInfo() аргыг дуудах
$this түлхүүр үгийг хаана хэрхэн ашиглахыг ойлгосон бол даалгаварыг биелүүлэхэд асуудалгүй. Ингээд кодыг үзүүлбэл:
<?php
class Users{
public $name;
public $login;
public $password;
// getInfo() арга
function getInfo(){
echo "<p>Name: ".$this->name."<br>";
echo "Login: ".$this->login."<br>";
echo "Password: ".$this->password."<br>";
}
}
$user1 = new Users();
$user1->name = "Бат";
$user1->login = "bataa";
$user1->password = 123;
// getInfo() аргыг дуудах
$user1->getInfo();
$user2 = new Users();
$user2->name = "Дорж";
$user2->login = "dorj";
$user2->password = 321;
// getInfo() аргыг дуудах
$user2->getInfo();
$user3 = new Users();
$user3->name = "Солонго";
$user3->login = "soko";
$user3->password = 456;
// getInfo() аргыг дуудах
$user3->getInfo();
?>
Аргад $this түлхүүр үгээр дамжуулан шинжид хандаж байгаа тул чухам аль обьектын шинжийг авахаа программ ойлгоод байгаа хэрэг шүү дээ. Жишээ нь $user3->getInfo(); гээд дуудахад тухайн үед ажиллаж байгаа обьект $user3 гэдгийг Php-д $this түлхүүр үг зааж өгөх болно.
Бид бараг юу ч хийгээгүй байхад программын код нилээд олон мөр болсон байгааг ОХП -ын зарчимтай зөрчилдөж байгаа юм биш биз гэсэн бодол төрж байж магадгүй. Бид дадлагын ажлаа дөнгөж эхлэж байгаа тул санаа зоволтгүй.
Бид обьектыг үүсгэж байхдаа $user1 = new Users(); гэж их хаалтыг бичээд байгааг анхаарна уу. Энд хаалт бичин өгөөд байгаа нь ямар нэгэн зүйлд хэрэгтэй гэдгийг логик тань хэлж байгаа бол та яг зөв ойлгосон байна.
Класст конструктор гэдэг шидэт арга байдаг. Яг энэ хаалт бол чухамдаа түүнийг заагаад байгаа хэрэг. Энэ тухай бид дараагийн хичээлээр үзэх болно.