কোনও ডিরেক্টরি থেকে সমস্ত পিএইচপি ফাইল কীভাবে অন্তর্ভুক্ত করবেন?


230

পিএইচপি-তে আমি স্ক্রিপ্টগুলির একটি ডিরেক্টরি অন্তর্ভুক্ত করতে পারি?

এর পরিবর্তে:

include('classes/Class1.php');
include('classes/Class2.php');

এখানে কি কিছু আছে:

include('classes/*');

কোনও নির্দিষ্ট শ্রেণীর জন্য প্রায় 10 টি উপ-শ্রেণীর সংগ্রহ সহ একটি ভাল উপায় খুঁজে পাওয়া যায়নি।

উত্তর:


437
foreach (glob("classes/*.php") as $filename)
{
    include $filename;
}

4
আমি ভেবেছিলাম অন্তর্ভুক্ত অন্তর্ভুক্ত () ব্যবহার করে একটি ক্লিনার দেখার উপায় থাকবে। তবে এটি ঠিক আছে। ধন্যবাদ সবাইকে.
অকচিসো

5
আমি একটি কনফিগারেশন ফাইল সহ একটি যথাযথ মডিউল সিস্টেম তৈরি করব, তবে এটি কেবল কারণ যা আমি সমস্ত কিছু অন্তর্ভুক্ত করার চেয়ে অনেক বেশি নমনীয় মনে করি । :-)
স্ট্যাটিক্সান

3
মনোযোগ দিন, কেবল বর্তমান ডিরেক্টরিতে ফাইল অন্তর্ভুক্ত করার জন্য কাজ করে। Get_incolve_path () এর মাধ্যমে পুনরাবৃত্তি করা সম্ভব হবে তবে এটি ক্লান্তিকর হয়ে ওঠে।
স্পষ্টত

20
বেস ক্লাসটি বাড়িয়ে দেওয়া ক্লাসগুলির জন্য যখন এই পদ্ধতিটি ভাল হয় না: যেমন যদি বেসক্লাস এক্সটেন্ডেড ক্লাসের পরে অ্যারেতে প্রদর্শিত হয়, তবে এটি কাজ করবে না!
কারমেজডন

2
@ খালি get_include_path()এখনও লোডিং অর্ডারটি স্বয়ংক্রিয়ভাবে নির্ধারণ করতে পারে না (বেস ক্লাসটি বর্ধিত শ্রেণীর পরে লোড করা হতে পারে, ত্রুটিগুলির ফলস্বরূপ)
র‌্যাপ্টর

50

এখানে পিএইচপি 5-তে বেশ কয়েকটি ফোল্ডার থেকে প্রচুর ক্লাস অন্তর্ভুক্ত করার পদ্ধতিটি এখানে রয়েছে only যদি আপনার ক্লাস থাকে তবেই এটি কাজ করবে though

/*Directories that contain classes*/
$classesDir = array (
    ROOT_DIR.'classes/',
    ROOT_DIR.'firephp/',
    ROOT_DIR.'includes/'
);
function __autoload($class_name) {
    global $classesDir;
    foreach ($classesDir as $directory) {
        if (file_exists($directory . $class_name . '.php')) {
            require_once ($directory . $class_name . '.php');
            return;
        }
    }
}

3
অটোল্যাড প্রাসঙ্গিক নয় কারণ এই প্রশ্নটি একটি ডিরেক্টরিতে সমস্ত কিছু অন্তর্ভুক্ত করার বিষয়ে ছিল - সাধারণত এটি বিভিন্ন ডিরেক্টরিতে হবে: উদাহরণস্বরূপ, বিই ডিরেক্টরিতে ডেটা ক্লাস এবং বিএল ডিরেক্টরিতে সংজ্ঞায়িত বিএল।
Carmageddon

1
গ্লোবালগুলি ব্যবহার করা কোনও সমাধান নয়
পিটার

আমি সুরকার ( getcomposer.org ) ব্যবহার করার পরামর্শ দিচ্ছি যদি আপনার এখানে কাস্টমাইজড অটোলোয়েডিং সমাধানের পরিবর্তে অটোলোয়েডের প্রয়োজন হয় what
কেল্ট

32

আমি বুঝতে পারি এটি একটি পুরানো পোস্ট তবে ... আপনার ক্লাসগুলি অন্তর্ভুক্ত করবেন না ... পরিবর্তে __আউটোলোড ব্যবহার করুন

function __autoload($class_name) {
    require_once('classes/'.$class_name.'.class.php');
}

$user = new User();

তারপরে আপনি যখনই একটি নতুন ক্লাস কল করবেন যা এখনও অন্তর্ভুক্ত করা হয়নি তবে পিএইচপি স্বয়ংক্রিয়ভাবে আগুন নেবে __আউটলোয়াদ এবং এটি আপনার জন্য অন্তর্ভুক্ত করবে


1
এটি পোস্ট করার সময় এটি একটি দৃ answer় উত্তর ছিল, পিএইচপি 7.2.0 হিসাবে এই পদ্ধতিটি অবচিত করা হয়েছে এবং এটি ব্যবহার করা উচিত নয়। পরিবর্তে, spl_autoload_register ব্যবহার করুন
হিমশীতলোক

1
উদ্দেশ্যটি যদি শ্রেণিগুলিকে অন্তর্ভুক্ত করা হয় তবে এটি আরও ভাল উত্তর।
ব্ল্যাকবাম

20

আপনি যদি পিএইচপি 5 ব্যবহার করছেন তবে আপনি তার পরিবর্তে অটোলোড ব্যবহার করতে চাইতে পারেন ।


20

এটি কার্স্টেনের কোডের একটি পরিবর্তন মাত্র

function include_all_php($folder){
    foreach (glob("{$folder}/*.php") as $filename)
    {
        include $filename;
    }
}

include_all_php("my_classes");

12
এটি গৃহীত উত্তরের সাথে প্রাসঙ্গিক কিছু যুক্ত করে না।
মোপিট

ধন্যবাদ এটিই হ'ল একমাত্র কোড যা আসলে কোনও কারণে কাজ করেছিল।
জোসেফ আস্ট্রাহান

19

2017 এ এটি কীভাবে করবেন:

spl_autoload_register( function ($class_name) {
    $CLASSES_DIR = __DIR__ . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR;  // or whatever your directory is
    $file = $CLASSES_DIR . $class_name . '.php';
    if( file_exists( $file ) ) include $file;  // only include if file exists, otherwise we might enter some conflicts with other pieces of code which are also using the spl_autoload_register function
} );

এখানে পিএইচপি ডকুমেন্টেশন দ্বারা প্রস্তাবিত: অটোলয়েডিং ক্লাস


এটি কোনও প্রশ্নের উত্তর দেয় না, কারণ autoloadকেউ তখনই খেলতে আসবে যখন কেউ চেষ্টা করবে অর্থাত্ লোড হয়নি এমন শ্রেণীর বস্তু তৈরি করার জন্য।
গডফাদার

9

আপনি set_incolve_path ব্যবহার করতে পারেন :

set_include_path('classes/');

http://php.net/manual/en/function.set-include-path.php


13
এটি ডিরেক্টরিতে সমস্ত পিএইচপি-ফাইলগুলি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করে না, কেবল / /classes/includerequire
Gherman

1

আপনি যদি একটি ডিরেক্টরি এবং এর উপ-ডিরেক্টরিতে সমস্ত অন্তর্ভুক্ত করতে চান:

$dir = "classes/";
$dh  = opendir($dir);
$dir_list = array($dir);
while (false !== ($filename = readdir($dh))) {
    if($filename!="."&&$filename!=".."&&is_dir($dir.$filename))
        array_push($dir_list, $dir.$filename."/");
}
foreach ($dir_list as $dir) {
    foreach (glob($dir."*.php") as $filename)
        require_once $filename;
}

ভুলে যাবেন না যে এটি আপনার ফাইলগুলি অন্তর্ভুক্ত করতে বর্ণমালা ক্রম ব্যবহার করবে।


3
"ভুলে যাবেন না এটি বর্ণানুক্রমিক আদেশটি ব্যবহার করবে" ভুল ... The entries are returned in the order in which they are stored by the filesystem.- php.net/manual/en/function.readdir.php
নিমোস্টেইন

1
ফাইলগুলি একে অপরের উপর নির্ভরশীল এবং আদেশ নির্ভরতার সাথে মেলে না তবে এটি কাজ করতে পারে না
আমানুয়েল নেগা

1

যদি আপনার ক্লাস একসাথে প্রতিটি ক্লাস একবারে সংজ্ঞায়িত না করে অন্তর্ভুক্ত করা থাকে তবে আপনি ব্যবহার করতে পারেন:

$directories = array(
            'system/',
            'system/db/',
            'system/common/'
);
foreach ($directories as $directory) {
    foreach(glob($directory . "*.php") as $class) {
        include_once $class;
    }
}

এইভাবে আপনি কেবল ক্লাস সমন্বিত পিএইচপি ফাইলে ক্লাসটি সংজ্ঞায়িত করতে পারেন এবং পুরো তালিকা নয় $thisclass = new thisclass();

যতক্ষণ না এটি সমস্ত ফাইল পরিচালনা করে? আমি নিশ্চিত নই যে এর সাথে কিছুটা গতি কমে যেতে পারে।


1

যদি ফাইলগুলির মধ্যে কোনও নির্ভরতা না থাকে ... সমস্ত সাবডিয়ারগুলিতে সমস্ত পিএইচপি ফাইল অন্তর্ভুক্ত করার জন্য এখানে একটি পুনরাবৃত্ত ফাংশন রয়েছে:

$paths = array();

function include_recursive( $path, $debug=false){
  foreach( glob( "$path/*") as $filename){        
    if( strpos( $filename, '.php') !== FALSE){ 
       # php files:
       include_once $filename;
       if( $debug) echo "<!-- included: $filename -->\n";
    } else { # dirs
       $paths[] = $filename; 
    }
  }
  # Time to process the dirs:
  for( $i=count($paths)-1; $i>0; $i--){
    $path = $paths[$i];
    unset( $paths[$i]);
    include_recursive( $path);
  }
}

include_recursive( "tree_to_include");
# or... to view debug in page source:
include_recursive( "tree_to_include", 'debug');

1
<?php
//Loading all php files into of functions/ folder 

$folder =   "./functions/"; 
$files = glob($folder."*.php"); // return array files

 foreach($files as $phpFile){   
     require_once("$phpFile"); 
}

দয়া করে আপনার কোডে আরও কিছু ব্যাখ্যা যুক্ত করুন, বিশেষত যেহেতু এই প্রশ্নের ইতিমধ্যে প্রচুর আপভেটেড উত্তর রয়েছে
নিকো হেস

0

আমি আপনাকে একটি রিডডির () ফাংশন ব্যবহার করার পরামর্শ দিচ্ছি এবং তারপরে ফাইলগুলি লুপ করে অন্তর্ভুক্ত করব (সেই পৃষ্ঠায় প্রথম উদাহরণ দেখুন)।


-1

ডিরেক্টরিতে ফাইল অন্তর্ভুক্ত করতে কোনও ফাংশন () লিখবেন না। আপনি ভেরিয়েবল স্কোপগুলি হারাতে পারেন এবং "গ্লোবাল" ব্যবহার করতে হতে পারে। কেবল ফাইলগুলিতে লুপ করুন।

এছাড়াও, যখন আপনি অন্তর্ভুক্ত ফাইলটির একটি শ্রেণীর নাম থাকে যা অন্য ফাইলটিতে সংজ্ঞায়িত অন্য শ্রেণিতে প্রসারিত হয় - যা এখনও অন্তর্ভুক্ত নেই আপনি অসুবিধাতেও ডেকে আনতে পারেন। তাই সতর্কতা অবলম্বন করা.


2
"ভেরিয়েবল স্কোপগুলি হারাতে" বলতে কী বোঝ?
piyush

3
আপনি পুনরায় ব্যবহার করতে চলেছেন বা কোডটিকে আরও "স্ব-ডকুমেন্টিং" করার জন্য আপনার সর্বদা একটি ফাংশন ব্যবহার করা উচিত। "গ্লোবাল স্কোপ" ইস্যুটি আমি মনে করি এটি একটি রেড হেরিং। আপনি যে কোনও সময় "বৈশ্বিক সুযোগ" ব্যবহার করছেন আপনি এড়াতে আপনার কোডটি পুনরায় লেখার বিষয়ে গুরুত্বের সাথে ভাবতে চান want
স্টেভ ইস্কুরা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.