Tags:

ผมสังเกตุเห็น Framework & CMS หลายตัวใช้ namespace และมีการตั้งชื่อเล่นให้กับ class ต่างๆ ด้วย class_alias เพื่อให้เรียกใช้ได้ง่ายๆ เช่น ในไฟล์ view คงไม่มีใครอยากใช้

System\Html\Html::image('pic.jpg');

ซึ่ง framework ก็ตั้งชื่อ alias เหลือแค่ Html::image();

คำถามคือ แล้วเราจะใช้ namespace ไปทำไม เพราะสุดท้ายก็ตั้งชื่อเล่นให้กลับไปเหมือนตอนยังไม่มี namespace ให้ใช้ แล้วก็มีปัญหาเรื่องชื่อ class ซ้ำกันอยู่ดี

Get latest news from Blognone
By: benjifx
ContributoriPhoneAndroidUbuntu
on 16 March 2015 - 08:53 #799735

เพราะตอนสร้าง alias มันต้องใช้ namespace ในการอ้างถึง class

By: crucifier
iPhoneAndroidUbuntu
on 16 March 2015 - 10:06 #799749

ผมถามงงๆ ได้คำตอบแล้วตอนนี้ก็ยังงงๆ ที่ผ่านมาได้แต่ใช้ของชาวบ้าน ถึงเวลาต้องมาสร้าง library เองแล้วสับสน T_T

By: Alien13
Android
on 16 March 2015 - 14:07 #799806

คงต้องอ่านคอนเซปของ laravel

By: bluezip
AndroidUbuntuWindows
on 16 March 2015 - 14:38 #799814

เพราะชื่อ class ใน php มีโอกาศซ้ำกันได้ครับเลยต้องกำหนด namespace เพื่อบอกว่า class นี้อยู่ที่ไหน

By: crucifier
iPhoneAndroidUbuntu
on 16 March 2015 - 19:20 #799864

ผมเข้าใจ 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 ไม่ได้เอาออกก็มี

By: bluezip
AndroidUbuntuWindows
on 17 March 2015 - 11:35 #799993 Reply to:799864

//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 นานแล้ว

By: crucifier
iPhoneAndroidUbuntu
on 17 March 2015 - 13:30 #800057 Reply to:799864

//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 กระจาย)

By: frost
iPhoneAndroidUbuntu
on 17 March 2015 - 14:50 #800098

ตั้งชื่อเล่นให้มันสั้นๆ
เพื่อลดโอกาสการพิมพ์ผิดเวลาเรียกใช้(ชื่อยาว โอกาสผิดสูง) แค่นั้นมั้งครับ