PHP හි OOP හි පන්ති සඳහා ස්වයංක්රීය පූරණ කිරීමේ ශ්රිතයක් සාදා ගැනීම
බොහෝ විට, පෙරනිමි ස්වයංක්රීය පූරණ කිරීම ඔබට නොගැලපෙන බවට හේතු තිබිය හැකිය. එවැනි සිදුවීම් වලදී, ඔබට ඔබේම ස්වයංක්රීය පූරණ කිරීමේ ක්රමයක් ලිවිය හැකිය.
මෙය සිදු කිරීම සඳහා, spl_autoload_register ශ්රිතයට
පළමු පරාමිතිය ලෙස ඔබ විසින් ලියන ලද callback ශ්රිතය යොමු කළ යුතුය.
PHP හට පූරණය නොකළ පන්තියකට ඇමතුමක් හඳුනා ගන්නා විට මෙම ශ්රිතය කැඳවනු ලැබේ.
මෙම ශ්රිතයේ පරාමිතියට නාම අවකාශය සමඟ පන්තියේ නම ලැබෙනු ඇත:
<?php
spl_autoload_register(function($class) {
// $class විචල්යයේ නාම අවකාශය සමඟ පන්තියේ නම අඩංගු වේ
});
?>
ශ්රිතයේ වගකීම වන්නේ පන්තියේ නම භාවිතා කර require හරහා
එම පන්තිය පූරණය කිරීම සිදු කිරීමයි.
එනම්, මෙම ශ්රිතය තුළ අපි පන්ති පූරණය කිරීම සඳහා අපගේම නීතිය,
හෙවත් අපගේම නම් කිරීමේ රීතිය (convention) ලිවිය යුතුය.
අපි අපේම ස්වයංක්රීය පූරණ කිරීමේ යන්ත්රයක උදාහරණයක් ලියමු. උදාහරණයක් ලෙස, අපි කියමු, වෙබ් අඩවියේ මූලයේ සිට පන්ති ගොනුව දක්වා පථය නාම අවකාශයට සමාන වන නමුත් අක්ෂර වින්යාසය (case) සුරැකෙන ආකාරයට.
එනම්, අප සතුව Core\Admin\PageController පන්තියක් තිබේ නම්,
එය වෙත ඇති පථය Core/Admin/PageController.php විය යුතුය.
ඔබට පෙනෙන පරිදි, එහි නාම අවකාශය සමඟ පන්තියේ නම පරිවර්තනය කිරීම සඳහා,
පසු කොටස් (backslashes) ඉදිරිපස කොටස් (forward slashes) ලෙස හරවා,
පන්තියේ නමට .php එකතු කිරීම පමණක් අවශ්ය වේ. අපි එය කරමු:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
කෙසේ නමුත්, අපට ගොනුවට සාපේක්ෂ පථයක් (වෙබ් අඩවියේ මූලයට සාපේක්ෂව) ලැබෙනු ඇත. සම්පූර්ණ පථයක් (absolute path) සාදා ගැනීම වඩා හොඳය, මෙලෙසින්:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
තවත් සූක්ෂ්ම කරුණක් තිබේ. විවිධ මෙහෙයුම් පද්ධතිවල,
ෆෝල්ඩර හරහා පථය ඉදිරිපස කොටසක් හෝ පසු කොටසක් සමඟ විය හැකිය.
අපගේ කේතය මෙහෙයුම් පද්ධතියෙන් ස්වායත්ත වන පරිදි සකස් කරමු.
මෙය සිදු කිරීම සඳහා, පථ වෙන් කිරීම සඳහා ඉදිරිපස කොටස වෙනුවට
DIRECTORY_SEPARATOR නියතය භාවිතා කරමු.
එය අපගේ ස්ක්රිප්ටය දැන් ක්රියාත්මක වන මෙහෙයුම් පද්ධතිය සඳහා නිවැරදි
කොටස අඩංගු කරයි. අවසානයේදී, අපට පහත කේතය ලැබේ:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
මා විසින් සාදන ලද ස්වයංක්රීය පූරණ කිරීමේ ශ්රිතය පරීක්ෂා කර බලන්න.
ඔබේම ස්වයංක්රීය පූරණ කිරීමේ රීතියක් සිතා එය ක්රියාත්මක කරන්න.