অটোলয়েডিং কি; আপনি কীভাবে spl_autoload, __autoload এবং spl_autoload_register ব্যবহার করবেন?


203

আমি উন্নত পিএইচপি মান শিখছি এবং নতুন এবং দরকারী পদ্ধতিগুলি প্রয়োগ করার চেষ্টা করছি। আগে আমি __autoloadপ্রতিটি পৃষ্ঠায় একাধিক ফাইল সহ পালাতে ব্যবহার করছিলাম তবে সম্প্রতি আমি একটি টিপ দেখেছি__autoload manual

spl_autoload_register () অটোলোডিং ক্লাসগুলির জন্য আরও নমনীয় বিকল্প সরবরাহ করে। এই কারণে, __autoload () ব্যবহার নিরুৎসাহিত করা হয়েছে এবং ভবিষ্যতে অবচয় বা অপসারণ করা যেতে পারে।

তবে কীভাবে বাস্তবায়ন করা যায় spl_autoloadএবং কী তা আমি সত্যিই বুঝতে পারি নাspl_autoload_register

উত্তর:


334

spl_autoload_register() আপনাকে একাধিক ফাংশন (বা আপনার নিজস্ব অটোলোড ক্লাসের স্ট্যাটিক পদ্ধতি) নিবন্ধভুক্ত করার অনুমতি দেয় যা পিএইচপি একটি স্ট্যাক / সারিতে রাখবে এবং "নতুন ক্লাস" ঘোষণার পরে ক্রমান্বয়ে কল করবে।

উদাহরণস্বরূপ:

spl_autoload_register('myAutoloader');

function myAutoloader($className)
{
    $path = '/path/to/class/';

    include $path.$className.'.php';
}

//-------------------------------------

$myClass = new MyClass();

উপরের উদাহরণে, "মাইক্লাস" সেই শ্রেণীর নাম যা আপনি ইনস্ট্যান্ট করার চেষ্টা করছেন, পিএইচপি এই নামটিকে একটি স্ট্রিং হিসাবে পাস করে spl_autoload_register(), যা আপনাকে পরিবর্তনশীল বাছাই করতে এবং উপযুক্ত শ্রেণি / ফাইলটিকে "অন্তর্ভুক্ত" করতে ব্যবহার করতে দেয় । ফলস্বরূপ আপনার নির্দিষ্টভাবে বিবৃতি অন্তর্ভুক্ত / আবশ্যক বিবরণের মাধ্যমে সেই শ্রেণিকে অন্তর্ভুক্ত করার দরকার নেই ...

উপরের উদাহরণের মতো আপনি যে ক্লাসটি ইনস্ট্যান্ট করতে চান কেবল তা কল করুন এবং যেহেতু আপনি spl_autoload_register()নিজের একটি ফাংশন (মাধ্যমে ) নিবন্ধ করেছেন যা আপনার সমস্ত শ্রেণি কোথায় রয়েছে তা নির্ধারণ করে, পিএইচপি এই ফাংশনটি ব্যবহার করবে।

ব্যবহারের সুবিধাটি spl_autoload_register()হ'ল এটির বিপরীতে __autoload()আপনার তৈরি প্রতিটি ফাইলের একটি অটোলোড ফাংশন প্রয়োগ করার দরকার নেই। spl_autoload_register()এছাড়াও আপনাকে অটোলয়েডিং গতি বাড়িয়ে তুলতে এবং আরও সহজ করে তুলতে একাধিক অটোল্যাড ফাংশনগুলি নিবন্ধভুক্ত করার অনুমতি দেয়।

উদাহরণ:

spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');

class MyAutoloader
{
    public static function ClassLoader($className)
    {
         //your loading logic here
    }


    public static function LibraryLoader($className)
    {
         //your loading logic here
    }

Spl_autoload এর সাথে সম্পর্কিত , ম্যানুয়ালটিতে বলা হয়েছে:

এই ফাংশনটির জন্য একটি ডিফল্ট বাস্তবায়ন হিসাবে ব্যবহার করার উদ্দেশ্যে __autoload()। যদি অন্য কোনও কিছুই নির্দিষ্ট না করা হয় এবং spl_autoload_register()কোনও পরামিতি ছাড়াই কল করা হয় তবে এই ফাংশনগুলি পরবর্তী কোনও কল করার জন্য ব্যবহৃত হবে __autoload()

আরও ব্যবহারিক শর্তে, যদি আপনার সমস্ত ফাইল একক ডিরেক্টরিতে অবস্থিত থাকে এবং আপনার অ্যাপ্লিকেশনটি কেবল .php ফাইলগুলিই ব্যবহার করে না, যেমন কাস্টম কনফিগারেশন ফাইলগুলি। ইন এক্সটেনশন সহ উদাহরণস্বরূপ, তবে আপনি যে কৌশলটি ব্যবহার করতে পারেন তা হ'ল আপনার ডিরেক্টরিতে সমস্ত ডিরেক্টরি যুক্ত করা পিএইচপি'র ফাইলগুলিতে (অন্তর্ভুক্ত set_include_path()) অন্তর্ভুক্ত থাকে ।
এবং আপনার যেহেতু আপনার কনফিগারেশন ফাইলগুলিরও প্রয়োজন রয়েছে তাই আপনি spl_autoload_extensions()পিএইচপি যে এক্সটেনশানগুলির সন্ধান করতে চান তার তালিকা তৈরি করতে ব্যবহার করবেন।

উদাহরণ:

set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();

যেহেতু spl_autoload __autoload()ম্যাজিক পদ্ধতির ডিফল্ট বাস্তবায়ন, তাই আপনি যখন নতুন ক্লাস চেষ্টা ও ইনস্ট্যান্ট করবেন তখন পিএইচপি spl_autoload কল করবে।

আশাকরি এটা সাহায্য করবে...


35
এটি উত্তরের ইতিহাসের সেরা উত্তরগুলির মধ্যে একটি হতে পারে। সম্মান. আমার কাছে ওঁদের মধ্যে একটি ছিল "ওএমজি! এখনই এটি বোধ হয়!" মুহুর্ত তোমার জন্য, আমার ভাল মানুষ। আমি মনে করি আমি কেবল একটি ফ্যান ক্লাব শুরু করতে পারি।
জাস্ট প্লেইন হাই

2
এমনকি বিকল্প মহাবিশ্বেও এটি সর্বকালের উত্তরের সেরা উত্তর বানাতে, দয়া করে এই spl_autoload যুক্ত করুন, হুম, "সহায়কভাবে" (?) সমস্ত ফাইলের নামকে ছোট হাতের মধ্যে রূপান্তরিত করে (নীচে @ ব্যবহারকারীর সাথে আমার মন্তব্য দেখুন)। আপনি যদি আপনার ক্যাপিটাল লেটারসএন্ডস্টফ পছন্দ করেন তবে spl_autoload_register () ভ্যানিলা ব্যবহার করতে পারবেন না।
জাস্ট প্লেইন হাই

6
@ জাস্ট সাদামাটা হাই আমি এই সমস্যাটি নিয়ে আসছি না এবং আমার ক্লাসের সমস্ত ফাইল উটচ্যুত করা আছে। বিটিডাব্লু, এটি একটি দুর্দান্ত উত্তর। এটি আমাকে একটি সাধারণ ধারণার আশেপাশে পেতে সাহায্য করেছিল যা আমি এই পোস্টটি না পড়া পর্যন্ত বুঝতে পারি না! আমার 85 (এবং বর্ধমান) লাইনে ফাইল অন্তর্ভুক্ত রয়েছে যা আমার সমস্ত শ্রেণীর ফাইল অন্তর্ভুক্ত করে এখন 7 লাইন!
কাইল

2
এটি প্রকৃতপক্ষে একটি ভাল উত্তর তবে আমি একটি জিনিস মিস করছি। আসল ডিফল্ট কার্যকারিতা কী? আমার জানা ক্লাসগুলির সাথে, এটি পথের মতো নেমস্পেস এবং ফাইলের নাম হিসাবে শ্রেণীর নাম ব্যবহার করে। যদিও এটি কীভাবে এটি ফাংশনগুলির সাথে কাজ করে তা আমি বুঝতে পারি না।
সিক্সস

2
(এবং সাধারণভাবে) এটি অলস বোঝাতে ফাইল / শ্রেণি অন্তর্ভুক্ত ব্যবহারের এক বিশাল সুবিধা নয় ? এটি উত্তরের দ্বারা জড়িত, তবে স্পষ্ট করে বলা হয়নি। আমার কাছে, এটি গুরুত্বপূর্ণ তথ্য যা আপনার উত্তরে অন্তর্ভুক্তির জন্য উপযুক্ত! :)spl_autoload_register()__autoload()
রিনোগো

13

পিএইচপি ৫.৩ থেকে আপনি spl_autoload_register()নেমস্পেসের সাহায্যে ব্যবহার করতে পারবেন , যার অর্থ আপনি নিজের প্রকল্পটি সংগঠিত করতে পারেন এবং কোনও __autoload()ফাংশন পুনরায় সংজ্ঞায়িত ছাড়াই আপনার পিএইচপি ক্লাসগুলি অটোল্যাড করতে পারেন ।

এই আচরণটি প্রদর্শনের জন্য, কেবলমাত্র index.php নামে একটি ফাইল তৈরি করুন:

<?php
spl_autoload_register();
var_dump(new Main\Application);

তারপরে index.php ফাইলের ঠিক পাশেই মেইন নামের একটি ফোল্ডার তৈরি করুন। অবশেষে, মাইনে অবস্থিত অ্যাপ্লিকেশন.এফপি নামে একটি ফাইল তৈরি করে এবং এতে নিম্নলিখিত কোডটি পেস্ট করুন:

<?php namespace Main;
class Application{}

9
এই সমস্তগুলির সাথে আমার ম্লানির একটি নোট: spl_autoload () - এবং এভাবে spl_autoload_register () - ফাইলের নামগুলি ছোট হাতের অক্ষরে রূপান্তর করে (বাগ রিপোর্ট, আবেদন ও উগ্র ভোটদান সত্ত্বেও)। এর অর্থ আপনি সম্ভবত "মুখ্য \ অ্যাপ্লিকেশন" খুঁজছেন কিন্তু spl_autoload "প্রধান \ অ্যাপ্লিকেশন" খুঁজছেন। আপনি যেমন আমার মতো উট পছন্দ করেন তবে আপনাকে নিজের ফাংশনটি লিখতে হবে। এখানে একটি দুর্দান্ত স্টার্টারের উদাহরণ রয়েছে: github.com/ircmaxell/PHP-CryptLib/blob/…
Just Plain High

1
পেশাদাররা: spl_autoload_register () হ'ল স্বয়ংক্রিয়ভাবে চালিত কনসের দ্রুততম পদ্ধতি: এটি কেবল ছোট হাতের ফাইল / শ্রেণি এবং নেমস্পেসগুলির সাথেও কাজ করবে, যা এই দিন এবং বয়সে যথেষ্ট সময় ব্যয় করে (ক্যামেলকেস ব্যবহার করার জন্য এটি বলার কোনও বিকল্প নেই)) তবে আপনি যদি নেমস্পেস / ক্লাসনেম.এফপি কাঠামো নিয়ে বেঁচে থাকতে পারেন তবে আর দেখার দরকার নেই।
স্ট্যামস্টার

1
spl_autoload_register()ডিফল্ট বাস্তবায়ন উত্তরাধিকারসূত্রে প্রাপ্ত ক্লাসগুলি সন্ধান করতে অক্ষম। সুতরাং ডিফল্ট, ছোট হাতের ফাইল এবং ডিরেক্টরিগুলি নামের জায়গার পথ প্রতিফলিত করে ব্যবহার করে, সমস্ত কিছু ঠিকঠাক হয় যদি না আমার ক্লাস না থাকে যা অন্য শ্রেণির (পিতামাতার) প্রসারিত করে। পিএইচপি তারপরে ত্রুটি ছুঁড়েছে যে এটি পিতামাতা শ্রেণিটি খুঁজে পাচ্ছে না, এমনকি তারা সবাই একই ডিরেক্টরি / নেমস্পেসে রয়েছে! বিভ্রান্তকর বিষয়টি হ'ল আক্ষরিক অর্থে কেবল প্রথম স্তরের ক্লাসগুলি পাওয়া যায়, সুতরাং আমি spl_autoload_register()1 ম এর পরে বেনাম ফাংশন নিয়মের সাথে আরেকটি রাখতে হয়েছিল যাতে নিখোঁজ পিতা বা মাতা / উত্তরাধিকার সূত্রে প্রাপ্ত ক্লাসগুলি অন্তর্ভুক্ত থাকে।
স্ট্যামস্টার

1

অটোল্যাডটি ব্যবহার করার উপায়টি এখানে। প্রদত্ত উদাহরণে আমি ক্লাসগুলি 3 টি ডাইরেন্ট ডিরেক্টরি তৈরি করতে চাই।

function namespaceAutoload($rawClass){

$class = str_replace('\\', DIRECTORY_SEPARATOR, $rawClass);

$possiblePaths[] = '..\sys\class\file.php';
$possiblePaths[] = '..\sys\class\lib\file.php';
$possiblePaths[] = '..\sys\class\class.file.inc.php';

foreach ($possiblePaths as $templatePath) {
    $path = str_replace(["\\", "file"], [DIRECTORY_SEPARATOR, $class], $templatePath);
    if (file_exists($path)) {
        require_once "$path";
        break;
    }
} spl_autoload_register("namespaceAutoload"); 

আমি প্রদত্ত উদাহরণটি, পিএইচপি এই তিনটি পৃথক ফাইল নাম ফর্ম্যাট ব্যবহার করে এই তিনটি ডিরেক্টরিতে নামস্থান \ শ্রেণীর সন্ধান করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.