ผมสังเกตุเห็น Framework & CMS หลายตัวใช้ namespace และมีการตั้งชื่อเล่นให้กับ class ต่างๆ ด้วย class_alias เพื่อให้เรียกใช้ได้ง่ายๆ เช่น ในไฟล์ view คงไม่มีใครอยากใช้
System\Html\Html::image('pic.jpg');
ซึ่ง framework ก็ตั้งชื่อ alias เหลือแค่ Html::image();
คำถามคือ แล้วเราจะใช้ namespace ไปทำไม เพราะสุดท้ายก็ตั้งชื่อเล่นให้กลับไปเหมือนตอนยังไม่มี namespace ให้ใช้ แล้วก็มีปัญหาเรื่องชื่อ class ซ้ำกันอยู่ดี
เพราะตอนสร้าง alias
benjifx Mon, 16/03/2015 - 08:53
เพราะตอนสร้าง alias มันต้องใช้ namespace ในการอ้างถึง class
ผมถามงงๆ
crucifier Mon, 16/03/2015 - 10:06
ผมถามงงๆ ได้คำตอบแล้วตอนนี้ก็ยังงงๆ ที่ผ่านมาได้แต่ใช้ของชาวบ้าน ถึงเวลาต้องมาสร้าง library เองแล้วสับสน T_T
คงต้องอ่านคอนเซปของ laravel
Alien13 Mon, 16/03/2015 - 14:07
คงต้องอ่านคอนเซปของ laravel
เพราะชื่อ class ใน php
bluezip Mon, 16/03/2015 - 14:38
เพราะชื่อ class ใน php มีโอกาศซ้ำกันได้ครับเลยต้องกำหนด namespace เพื่อบอกว่า class นี้อยู่ที่ไหน
ผมเข้าใจ concept ของ
crucifier Mon, 16/03/2015 - 19:20
ผมเข้าใจ concept ของ namespace ครับ แต่อย่างที่พยายามอธิบายอย่างงงๆ ว่า ทำไมต้องมาตั้งชื่อเล่นให้ Namesapce\Class อีก โดยใช้ฟังก์ชัน class_alias ร่วมกับการทำ overloading เช่น เปลี่ยนการอ้างชื่อยาวๆ จาก
Mvc\Helper\String::replace();
หรือ
use Mvc\Helper\String as String;
ให้สามารถเรียกใช้ได้สั้นๆ แบบนี้โดยตรง
String::replace();
โดยไม่ต้องใช้ keyword use ในทุกไฟล์ที่เรากำลังทำงานอยู่
ยกตัวอย่างที่ใช้วิธีข้างบนก็เช่น Joomla เป็นต้น เข้าใจว่าเพื่อให้เรียกใช้ได้ง่ายจาก component แต่ผมสงสัยว่าอุตส่าห์ใช้ namespace แล้ว ยังจะมาตั้งชื่อเล่น (alias) ให้มันอีก สุดท้ายหากมีคลาสชื่อซ้ำกันในอนาคตก็พังอยู่ดี
แต่ Drupal 7 ปรากฎว่าใช้ keyword use ในทุกไฟล์ เช่นไฟล์ template นี่ อ้าง keyword use กันเป็น 10 บรรทัด
จึงสงสัยว่ามันมีเหตุผลอะไรที่ Joomla ต้องทำอย่างนั้น?
--
อันนี้ไม่เกี่ยวกับประเด็นข้างต้น แต่เป็นความคิดเห็นว่าการต้องมาใช้ keyword use นี่เสียเวลานะ บางทีทำงานไปเรื่อยๆ บาง class ไม่ได้ถูกเรียกใช้แล้ว แต่ยังประกาศไว้โดย keyword use ไม่ได้เอาออกก็มี
//index.php use
bluezip Tue, 17/03/2015 - 11:35
In reply to ผมเข้าใจ concept ของ by crucifier
//index.php
use Mvc\Helper\String as String;
use Mvc\Helper\String2 as String;
ถ้าตั่งแบบนี้พังแน่นอน เพราะว่า ชื่อซ้ำกัน
แต่ถ้า
//index.php
use Mvc\Helper\String as String;
//index2.php
use Mvc\Helper\String2 as String;
แบบนี้ไม่น่าจะพัง
ไม่รู้ว่าเวลาใช้งานจะเรียกชื่อ file แบบนี้หรือเปล่า
//index.php
use Mvc\Helper\String as String;
use Mvc\Helper\Chat as Chat;
use Mvc\Helper\Action as Action;
use Mvc\Helper\Controller as Controller;
use Mvc\Helper\Router as Router;
...
...
...
ถ้าทำแบบนี้น่าจะเขียนไม่รัดกุมนะครับ คือเราเอาแค่ class ที่เราจะต้องใช้ในหน้านั้นเท่านั้นก็พออันไหนไม่ได้ใช้ก็ไม่ต้องประกาศ
หมายเหตุ การเรียกใช้น่าจะใช้ประมาณแบบนี้ ถ้าผิดพลาดก็ขอโทษด้วยนะครับเพราะผมไม่ได้เขียน php นานแล้ว
//index.php use
crucifier Tue, 17/03/2015 - 13:30
In reply to ผมเข้าใจ concept ของ by crucifier
//index.php
use Mvc\Helper\String as String;
//index2.php
use Mvc\Helper\String2 as String;
แบบนี้พังครับ ลองแล้ว ^^ แต่นั่นยังเป็นคนละประเด็นกับที่ผมพูดถึงครับ (เรื่องมันซับซ้อนเนาะ อธิบายยาก 555)
คำว่าชื่อเล่นของผมไม่ได้หมายถึงการใช้ use ... as ครับ แต่หมายถึงการใช้ฟังก์ชัน class_alias ตั้งชื่อเล่นให้มันตั้งแต่ตอนทำ overloading เลย ซึ่งตอนนี้ผมไม่สนใจละว่าทำไม เพราะ...
หลังจากผมนั่งหาข้อมูลและแกะโค้ดชาวบ้าน รวมถึงทดลองทำด้วยตนเองมา 2-3 วัน พอจะจับทาง (เดา) ได้ว่าที่ Joomla! ต้องตั้งชื่อเล่นให้ namespace นอกจากเพื่อให้เรียกใช้งานได้ง่ายๆ แล้ว (ไม่ต้องมา use ทุกครั้งในทุกไฟล์) ก็เพื่อให้ legacy code ทำงานได้ด้วย
ส่วน drupal 8 ตัว stable ยังไม่ release เลยสามารถใช้แนวทางการเขียนแบบใหม่ได้เลย (use กระจาย)
ตั้งชื่อเล่นให้มันสั้นๆ เพื่อ
frost Tue, 17/03/2015 - 14:50
ตั้งชื่อเล่นให้มันสั้นๆ
เพื่อลดโอกาสการพิมพ์ผิดเวลาเรียกใช้(ชื่อยาว โอกาสผิดสูง) แค่นั้นมั้งครับ