ใครช่วยอธิบายเรื่องการใช้ namespace ใน PHP หน่อยครับ ไม่ค่อยเข้าใจเลยครับ
ขอบคุณมากครับ ผมนี่จินตามเลย สุดยอด ว่าแต่ถ้าสมมุติ ผมต้องการให้เรียก path โดยไม่ต้องเริ่มจาก c:/ เนี้ย เช่นจะเรียกแค่จาก
ีuse \myscript\myclass\classname;
เรียกแบบนี้จะได้ไหมแล้วมีปัญหาอะไรแก้ยังไงครับ
Date :
2015-01-27 14:08:06
By :
melodyApinan
http://php.net/manual/en/language.namespaces.php
อ่านตรงนี้ครับ โดยหลักการไม่มีอะไรมาก encapsulation คล้ายกับการเขียนคลาสเมธอด แต่เพิ่มขึ้นมาเหนือกว่าอีกระดับ
ใช้จัดการงานประเภท โมดูล หรือระบบที่มีไฟล์มากมายหลายชั่น ผสมกับ autoload จะไม่ต้องมา include ไฟล์เอง ช่วยลดการสับสนหากชื่อไฟล์ ชื่อคลาสเดียวกัน แต่คนละโมดูล
ประวัติการแก้ไข 2015-01-27 19:44:34 2015-01-28 08:44:46
Date :
2015-01-27 19:43:51
By :
pjgunner.com
Ex.
abc.php
namespace abc;
function substr($str, $start, $end){
$start -= 1;
$length = $end - $start;
return \substr($str, $start, $length);
}
function println($str = ''){
echo $str.'<br />';
}
test_namespace.php
require_once 'abc.php';
use abc as myfunc;
$str = "Hello's girl.";
echo myfunc\substr($str, 9, 12);
abc\println();
echo \abc\substr($str, 1, 5);
myfunc\println();
echo substr($str, 1, 5);
Result
girl
Hello
ello'
ประวัติการแก้ไข 2015-01-27 20:26:05
Date :
2015-01-27 20:16:25
By :
pjgunner.com
แล้วกรณีที่ใช้ร่วมกับ autoload และ class อยู่ในคนละโฟลเดอร์กับไฟล์ที่เรียกใช้ class จะทำอย่างไรของตัวอย่างหน่อยครับ
ตัวอย่างโครงสร้างไฟล์
[root]
|-lib
| |--ClassA.php
| |--ClassB.php
| |--ClassC.php
|-www
| |-index.php
| |-bootstrap.php
| |-autoload.php
การทำงานคือ ให้ไฟล์ bootstrap.php เรียกใช้ class ใน lib โดยอัตโนมัติ โดยใช้ autoload.php เป็นฟังก์ชั่นสำหรับ include ไฟล์อัตโนมัติ
และใช้ namspace เรียกใช้แต่ละ class เพื่อป้องกันชื่อ class ซ้ำกัน
autoload.php
function __autoload($class_name) {
require_once '../lib/' . $class_name . '.php';
}
Date :
2015-01-28 15:48:29
By :
melodyApinan
Code (PHP)
function __autoload($class_name) {
$class_name = str_replace('\\', '/', $class_name);
require_once '../lib/' . $class_name . '.php';
}
http://www.pjgunner.com
ประวัติการแก้ไข 2015-01-28 17:34:59 2015-01-28 17:35:15 2015-01-28 18:17:15
Date :
2015-01-28 17:08:29
By :
pjgunner.com
จริงๆ ควรใช้ตัวนี้ดีกว่า spl_autoload_register()
มันสามารถเรียงตามลำดับการโหลดได้หากหาไม่พบ จะเรียกตัวอื่นถ้าคุณใช้โมดูล ของเขาเขาก็อาจมี auto load ของตัวเอง เช่นกัน
อย่างคำถาม นี้ ก็ควรเก็บค่า Root ไว้ จะได้ root ของเว็บเรา ใช้ง่ายกว่า เพราะไม่ต้องไปสนใจว่าตอนนี้เรียกจากไหน
เช่น
require_once $root_dir. '/' . $class_name . '.php';
จาก
|-lib
| |--ClassA.php
| |--ClassB.php
| |--ClassC.php
|-www
| |-index.php
| |-bootstrap.php
| |-autoload.php
| |-abc
| | |-aaa.php
ถ้าทำแบบ ../ จะหาไม่เจอ ยกเว้นวิธีที่บอกไป
Date :
2015-01-28 17:46:11
By :
pjgunner.com
Example
index.php ทุกรีเควสจะเข้ามาที่นี่ ถ้า โครงสร้าง เป็นแบบ No.7
define('ROOT_PATH', realpath(__DIR__.'/..'));
spl_autoload_register(function ($class){
$file = ROOT_PATH.'/'.str_replace('\\', '/', $class).'.php';
if (file_exists($file)){
require_once $file;
return true;
}
return false;
});
require_once 'bootstrap.php';
ClassB.php
namespace lib;
class ClassB{
public function __construct(){
echo 'B construced namespace: '.__namespace__;
}
}
bootstrap.php
new \lib\ClassB();
ประวัติการแก้ไข 2015-01-28 18:31:18
Date :
2015-01-28 18:28:04
By :
pjgunner.com
Get เลย
Date :
2015-01-28 22:20:26
By :
melodyApinan
Load balance : Server 05