สองคีย์เวิร์ดนี้ public, private เขาไว้สำหรับกำหนดขอบเขตการเข้าถึงฟังก์ชั่นหรือตัวแปรภายในออบเจ็ก ดอตอยอ

<?php
class People {
public $cardID;
public $firstName;
public $lastName
publict __construct() {
$this->cardID = '3-4512-22-213542';
$this->firstName = 'Watcharamet';
$this->lastName = 'Srinethirothai';
}
private changeName($name) {
$this->firstName = $name;
}
public getFullName() {
return $this->firstName .' '. $this->lastName;
}
public setFirstName($name) {
$this->changeName($name);
}
}

ตอนพระเจ้าสร้างออบเจ็กขึ้นมา พระเจ้าจะกำหนดไว้แล้วว่า ฟังก์ชั่นไหนไม่ให้เรียกจากภายนอก ฟังก์ชั่นไหนให้เรียกจากภายนอกได้และเรียกจากภายในก็ได้ เหตุผลที่ทำอย่างนี้น่ะเหรอ ก็เพื่อจำกัดกรอบของบักให้แคบลง หรือไม่งั้นก็อาจจะเพราะอินดี้ก็ได้ เอ้า… ทำไมอะเราไม่ให้เรียกใช้ฟังก์ชั่นนี้จากภายนอกอะ เราผิดเหรอ

ผมเคยเจอบ่อย ตอนที่เขียนปลักอินติดต่อกับวูคอมเมิร์ส เรียกฟังก์ชั่นไป ตอบกลับเออเร่อมาว่าฟังก์ชั่นนี้ไม่ให้เรียกจากภายนอก เป็น private อะไรอะ… ลองเข้าไปอ่านโค้ดของวูคอมเมิร์สดูก็ไม่น่าจะต้องจำกัดสิทธิ์การเข้าถึง ผมถึงบอกว่าบางทีก็เพราะพระเจ้าอินดี้

ก็แล้วแต่แหละ เขียนๆไปมีประสบการณ์เยอะๆ จะรู้เองว่า อ๋อฟังก์ชั่นนี้เราใช้ส่วนตัวภายในก็พอ

เอาล่ะมาดูการเรียกใช้งานจากคลาสข้างบน

<?php
class People {
public $cardID;
public $firstName;
public $lastName
publict __construct() {
$this->cardID = '3-4512-22-213542';
$this->firstName = 'Watcharamet';
$this->lastName = 'Srinethirothai';
}
private changeName($name) {
$this->firstName = $name;
}
public getFullName() {
return $this->firstName .' '. $this->lastName;
}
public setFirstName($name) {
$this->changeName($name);
}
}
$platoosom = new People();
$name = $platoosom->getFullName();

เราจะได้ตัวแปร name เท่ากับ Watcharamet Srinethirothai

แต่ถ้าเราเรียกอย่างนี้ เออเร่อเลยนะครับ

<?php
class People {
public $cardID;
public $firstName;
public $lastName
public __construct() {
$this->cardID = '3-4512-22-213542';
$this->firstName = 'Watcharamet';
$this->lastName = 'Srinethirothai';
}
private changeName($name) {
$this->firstName = $name;
}
public getFullName() {
return $this->firstName .' '. $this->lastName;
}
public setFirstName($name) {
$this->changeName($name);
}
}
$platoosom = new People();
$platoosom->changeName('Warent');
$name = $platoosom->getFullName();

มันจะเออเร่อตรงบรรทัด 29 เพราะว่าในคลาสประกาศฟังก์ชั้น changeName() ไว้เป็น private ไม่สามารถเรียกใช้งานแบบนี้ได้ มันใช้ได้เฉพาะภายในคลาสเท่านั้น ดูเอาตรงบรรทัด 23 นั่น เรียกภายในไม่เป็นไรไม่เออเร่อ

ครับสรุปตบท้าย public นั้นเรียกได้ทั้งจากภายนอกและภายใน ส่วน private นั้นเรียกได้แต่จากภายใน เหตุผลก็เพื่อความปลอดภัยหรือเพราะความอินดี้ เขียนไปเรื่อยๆประสบการณ์จะบอกเอง

ครั้นผมจะบอกเอง ผมก็ใช้เหตุผลอินดี้ซะส่วนใหญ่