আমি কি আমার প্লাগ ইনটিতে spl_autoload_register () ব্যবহার করব?


11

আমি যখন আমার প্লাগিনে spl_autoload_register ব্যবহার করি তখন আমি পাই:

    Fatal error: Uncaught exception 'LogicException' with message
   'Class wp_atom_server could not be loaded'

    wp-includes\pluggable-deprecated.php on line 182

আমি কিছু পাঠ করেছি এবং বিভিন্ন সংশোধন পেয়েছি। এসও-তে থাকা একজন বলেছিলেন যে ওয়ার্ডপ্রেসের সাথে spl_autoload_register ব্যবহার করবেন না।

এটা কি সঠিক?

আমি নিশ্চিত যে আমি ত্রুটির জন্য একটি "ফিক্স" খুঁজে পেতে পারি তবে আমি নিশ্চিত নই যে আমি প্রতিটি ডাব্লুপি প্রকাশের সাথে এটি করতে চাই।

আমি যদি অটোলোড ফাংশনটি না ব্যবহার করি তবে আমার ক্লাসগুলি কীভাবে লোড করা উচিত? এখানে এখন বিরতি কি:

spl_autoload_extensions(".php");
spl_autoload_register();

use MyPluginClasses\Student as MS;

$student = new MS\Student();

echo $student->sayHello();

শিক্ষার্থী:

<?PHP
namespace MyPluginClasses\Student
{
    class Student{
        public function __Construct(){
            echo "Hello Johnny";
        }
        public function sayHello(){
            echo "Hello Johnny's Method";

        }

    }
}

এই ডিজাইনটি ওয়ার্ডপ্রেসের বাইরেও দুর্দান্ত কাজ করে।


4
আমি আমার উত্তর আপডেট করেছি । যদি আপনি এটি সঠিকভাবে করেন - কলব্যাক ফাংশন সহ - আপনি spl_autoload_register()নেতিবাচক পার্শ্ব-প্রতিক্রিয়া ছাড়াই ব্যবহার করতে পারেন ।
ফুসিয়া

1
@ টসচো কি আপনার কোডটি এখনও ডাব্লুপি-তে অটোলয়েডিংয়ের সবচেয়ে ভাল উপায়?
জনি

না এটা না. দ্রুততম glob()ডিরেক্টরিটি একবার ডিরেক্টরিতে হয়, তারপরে ক্লাসগুলি যখন প্রয়োজন হয় তখন তাদের সরবরাহ করুন spl_autoload_register()
ফুসিয়া

1
আমি একটি উত্তর পরে লিখব, মাল্টি্লিংগুয়াল প্রেস থেকে আমাদের বর্তমান (এখনও প্রকাশিত হয়নি) সমাধান দেখিয়ে।
ফুসিয়া

উত্তর:


1

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

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

/**
 * Annframe Class Autoloader.
 *
 * @package Annframe
 * @since 0.1.0
 */
class Annframe_Autoloader {
    /**
     * Singleton.
     *
     * @since 0.1.0
     * @var Annframe_Autoloader - Single instance.
     */
    private static $_instance = null;

    /**
     * Private Construct.
     *
     * @package Annframe
     * @since 0.1.0
     */
    private function __construct() {
        spl_autoload_register( array( $this, 'load' ) );
    }

    /**
     * Singleton method.
     *
     * @package Annframe
     * @since 0.1.0
     */
    public static function _instance() {
        if ( ! self::$_instance ) {
            self::$_instance = new Annframe_Autoloader();
        }
        return self::$_instance;
    }

    /**
     * Class Loader.
     *
     * @package Annframe
     * @since 0.1.0
     *
     * @param string $class_name - Class name to load.
     * @return null - Do not return anything.
     */
    public function load( $class_name ) {
        $file = str_replace( '_', '-', strtolower( $class_name ) );
        $file = 'class-' . $file;
        if ( is_readable( trailingslashit( YOUR_PLUGIN_PATH. '/classes-dir' ) . $file . '.php' ) ) {
            include_once trailingslashit( YOUR_PLUGIN_PATH. '/classes-dir' ) . $file . '.php';
        }
        return;
    }
}

Annframe_Autoloader::_instance();

এই সাধারণ ক্লাসটিকে ভাঙার জন্য যেমন আপনি দেখতে পাচ্ছেন আমি সিঙ্গলটন প্যাটার্নটি ব্যবহার করছি। Constructorব্যক্তিগত এবং instance()& $_instanceনিদর্শন অন্তর্ভুক্ত। কনস্ট্রাক্টরের spl_autoload_registerকাজ রয়েছে।

spl_autoload_register( array( $this, 'load' ) );

যা loadস্ব শ্রেণীর থেকে পদ্ধতি কল করছে । এই পদ্ধতি থেকে প্রথম দুটি লাইন হ'ল:

$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;

যা বেশ সোজা। আপনি যদি ডাব্লুপিসিএস অনুসরণ করেন তবে এটি আপনাকে ক্লাসের নামকরণ কনভেনশন শব্দের শ্রেণীর সাথে এবং তার পরে শ্রেণীর নামের সাথে অনুসরণ করতে উত্সাহিত করবে । অবশ্যই কোনও আন্ডারস্কোর (_) এর সাথে (-) ড্যাশ প্রতিস্থাপন করা হয়েছে।

ক্লাসের একটি ফাইল নাম WPSE_Postহবেclass-wpse-post.php

নিম্ন কেসিং ক্লাসের নামগুলি ড্যাশগুলির সাথে আন্ডারস্কোরগুলি প্রতিস্থাপন করতে strtolowerএবং ব্যবহার করে str_replace। তাই WPSE_Postএখন হয়ে যায় wpse-post। অবশেষে class-পরের লাইনে একটি উপসর্গ যুক্ত করুন।

আমি is_readableশর্তাধীন বিবৃতি ব্যবহার করছি যা এর সাথে বিনিময়যোগ্য file_exists। ধরে YOUR_PLUGIN_PATHনেওয়া প্লাগইন এর বেস পাথ এবং classes-dirমূল প্লাগইন ডিয়ারের অধীনে আপনার সমস্ত ক্লাসের অধীনে রয়েছে যেখানে অটোলয়েডিং দরকার।

include_once কল এ আসল ফাইল লোড করতে ব্যবহৃত হয়।

ব্যবহার:

আপনাকে কেবলমাত্র আপনার প্লাগইনের বেস ফাইলটিতে উপরের অটো লোডার শ্রেণি অন্তর্ভুক্ত করতে হবে

/**
 * Class autoloader.
 */
if ( ! class_exists( 'Annframe_Autoloader' ) ) {
    include_once YOUR_PLUGIN_PATH/class-annframe-autoloader.php';
}

এবং তারপরে আপনার ক্লাসগুলিকে কল করুন।

new XYX_Class();
Another_Class::instance(); // etc

দ্রষ্টব্য: আমি আমার সমাধানে নেমস্পেস পদ্ধতিটি ব্যবহার করছি না তাই এটি আপনার প্রয়োজন অনুসারে উপযুক্ত হতে পারে বা নাও পারে তবে এই পোস্টে এই পোস্টে পোস্ট করা হয়েছে যে কমপক্ষে কেউ গতিশীলভাবে ক্লাস লোড করার সুবিধা পাবে।


-1
    function MyPluginClasses_autoloader( $class_name ) {
  if ( false !== strpos( $class_name, 'MyPluginClasses' ) ) {
    $parts = explode('\\', $class_name);
    require_once RoothPath . DIRECTORY_SEPARATOR .'lib'.DIRECTORY_SEPARATOR.end($parts) . '.php';
  }
}
spl_autoload_register( 'MyPluginClasses_autoloader' );
use MyPluginClasses\Student as MS;
$student = new MS\Student();
echo $student->sayHello();

2
পোস্টিং কোডটি ভাল হলেও আপনার কীভাবে এবং কেন এই প্রশ্নের উত্তর দেওয়া উচিত তা ব্যাখ্যা করা উচিত।
লক্ষ্মণা

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