কীভাবে "ব্যবহার" শব্দটি পিএইচপি তে কাজ করে এবং আমি কী এটি দিয়ে ক্লাস আমদানি করতে পারি?


136

আমার একটি ক্লাস সহ একটি ফাইল আছে Resp । পথটি হ'ল:

C:\xampp\htdocs\One\Classes\Resp.php

এবং আমি একটি আছে index.php এই ডিরেক্টরিতে ফাইল :

C:\xampp\htdocs\Two\Http\index.php

এই index.php ফাইলে আমি একটি ক্লাস ইনস্ট্যান্ট করতে চাই Resp

$a = new Resp();

আমি জানি আমি ব্যবহার করতে পারি requireinclude ক্লাসের সাথে ফাইলটি অন্তর্ভুক্ত বা কীওয়ার্ডগুলি :

require("One\Classes\Resp.php");       // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();

তবে আমি ব্যবহার না করে requireবা ক্লাস আমদানি করতে চাইinclude । আমি useকীওয়ার্ডটি কীভাবে কাজ করে তা বোঝার চেষ্টা করছি । আমি এই পদক্ষেপগুলি চেষ্টা করেছিলাম কিন্তু কিছুই কার্যকর হয় না:

use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes;    /* nothing works */

$a = new Resp();

এটা বলে:

Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php

কীওয়ার্ডটি কীভাবে useকাজ করে? আমি কি ক্লাস আমদানি করতে এটি ব্যবহার করতে পারি?


1
ফাইলগুলি আমদানি করা ছাড়া আপনি পারবেন না। প্রবাহ পরিবর্তন করবেন না দয়া করে। এছাড়াও नेमস্পেসগুলি সত্যই পিএইচপি-তে ব্যবহৃত হয় না। ঠিক ভিবি.এনইটি
কোল জনসন

13
@ কোল-জনসন, আপনার সাথে একমত নন সাইফনি প্রায় নির্মিত হয় namespace। আসলে আপনি যদি নেমস্পেস ব্যবহার না করেন তবে কোনও সিমফনি নেই
গ্রিন

উত্তর:


80

useকিছুই অন্তর্ভুক্ত না। এটি কেবলমাত্র বর্তমান সুযোগে নির্দিষ্ট নামস্থান (বা শ্রেণি) আমদানি করে

আপনি যদি ক্লাসগুলি স্বয়ংক্রিয়ভাবে চালিত করতে চান - অটোলয়েডিং সম্পর্কে পড়ুন


@ জি-ম্যান এটি জিজ্ঞাসা করা খুব প্রশ্নের উত্তর দেয়।
zerkms

188

না, আপনি useকীওয়ার্ড সহ কোনও শ্রেণি আমদানি করতে পারবেন না । আপনাকে include/ requireবিবৃতি ব্যবহার করতে হবে । এমনকি যদি আপনি পিএইচপি অটো লোডার ব্যবহার করেন, তবুও অটোলোডারকে হয় includeবা requireঅভ্যন্তরীণভাবে ব্যবহার করতে হবে ।

ব্যবহারের কীওয়ার্ডের উদ্দেশ্য :

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

আজকাল প্রধান অবকাঠামো ব্যবহার করবেন includeবা requireমাধ্যমে composerএবংpsr

1) সুরকার

2) পিএসআর -4 অটোলোডার

এগুলির মধ্য দিয়ে যেতে আপনাকে আরও সাহায্য করতে পারে। সঠিক ক্লাসের ঠিকানা দেওয়ার জন্য আপনি একটি উপনাম ব্যবহার করতে পারেন। ধরুন আপনি একই নামের সাথে দুটি ক্লাস পেয়েছেন, Mailerদুটি ভিন্ন নেমস্পেস দিয়ে বলুন :

namespace SMTP;
class Mailer{}

এবং

namespace Mailgun;
class Mailer{}

এবং যদি আপনি একই সাথে মেলার উভয় ক্লাসই ব্যবহার করতে চান তবে আপনি একটি নাম ব্যবহার করতে পারেন।

use SMTP\Mailer as SMTPMailer;
use Mailgun\Mailer as MailgunMailer;

আপনার কোডে পরে যদি আপনি এই শ্রেণীর অবজেক্টগুলিতে অ্যাক্সেস করতে চান তবে আপনি নিম্নলিখিতগুলি করতে পারেন:

$smtp_mailer = new SMTPMailer;
$mailgun_mailer = new MailgunMailer;

এটি মূল শ্রেণীর রেফারেন্স দেবে।

কিছু বিভ্রান্ত হতে পারে যে এরপরে অনুরূপ শ্রেণীর নাম নেই তবে useকীওয়ার্ডের কোনও ব্যবহার নেই । ঠিক আছে, আপনি __autoload($class)ফাংশনটি ব্যবহার করতে পারেন যা কখন স্বয়ংক্রিয়ভাবে ডাকা হবেuse ক্লাসের সাথে স্টেটমেন্টটি আর্গুমেন্ট হিসাবে প্রয়োগ করা এবং এটি আপনাকে যখন প্রয়োজন হিসাবে ফ্লাইয়ের সময় রান করার সময় ক্লাসটি লোড করতে সহায়তা করতে পারে।

শ্রেণীর অটোলোডার সম্পর্কে আরও জানতে এই উত্তরটি দেখুন।


কেন শুধু আলাদা শ্রেণির নাম ব্যবহার করবেন না?
divine

15
@divine। ক্লাসগুলি তৃতীয় পক্ষের বিক্রেতাদের হতে পারে
ডায়ো

3
@divine। উভয় সংঘর্ষ ক্লাস 3 য় পক্ষের হয় কি?
ডায়ো

2
@ ডিভাইন কনভেনশন অনুসারে, নেমস্পেসটি <ওয়েন্ডারনাম> / <প্যাকেজনেম> হবে যাতে এটি ইতিমধ্যে সমাধান হয়ে গেছে। সম্মেলনের পরে, প্যাকেজিস্টের পক্ষে অন্য কারও কাছ থেকে একই বিক্রেতার নাম গ্রহণ করা অসম্ভব। এবং প্যাকেগিস্ট.অর্গ.এইচ পিএইচপি সংগ্রহস্থল যা প্যাকেজগুলির সুরকার স্থাপনের জন্য ব্যবহৃত হয়।
টপোজকা

1
@ রুট কোনও বিষয় নয়, এটি রান ব্যবহারের সময়টি বলে দেয়। যেমন আপনি গাড়ি চালাচ্ছেন এবং সিগন্যাল আপনাকে বলছে সামনের দিকে ধাক্কা খায় এবং আপনি ব্রেক হয়ে যান, ঠিক useতেমন স্টেটমেন্টটি আমার জন্য এখন এটি সংকলক লোডকে বলবে। বুঝেছি প্রিয়!
রাজন রাওয়াল

23

চিন্তা কোরো না কি নামস্থান হয়।

নামস্থান মূলত শুধু একটি হল ক্লাস উপসর্গ (অপারেটিং সিস্টেম ডিরেক্টরিতে মত) নিশ্চিত করার ক্লাস পথ স্বতন্ত্রতা।

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

উদাহরণ:

// You can do this at the top of your Class
use Symfony\Component\Debug\Debug;

if ($_SERVER['APP_DEBUG']) {
    // So you can utilize the Debug class it in an elegant way
    Debug::enable();
    // Instead of this ugly one
    // \Symfony\Component\Debug\Debug::enable();
}

যদি আপনি জানতে চান যে পিএইচপি নেমস্পেস এবং অটোলয়েডিং (পুরানো উপায় পাশাপাশি সুরকারের সাথে নতুন উপায়) কীভাবে কাজ করে তবে আপনি এই বিষয়টিতে সবেমাত্র লিখেছি যে ব্লগ পোস্টটি পড়তে পারেন: https://enterprise-level-php.com/ 2017/12/25 /-জাদু-পিছনে-autoloading-পিএইচপি-ফাইল-ব্যবহার-composer.html


8

আপনাকে যেভাবেই হোক ক্লাসটি অন্তর্ভুক্ত করতে হবে / প্রয়োজন হবে, অন্যথায় পিএইচপি নেমস্পেস সম্পর্কে জানতে পারবে না।
আপনাকে একই ফাইলটিতে এটি করার দরকার নেই। উদাহরণস্বরূপ আপনি এটি বুটস্ট্র্যাপ ফাইলে করতে পারেন। (বা একটি অটোলোডার ব্যবহার করুন, তবে এটি আসলে বিষয়টি নয়)


4

সমস্যাটি সম্ভবতঃ আপনাকে একটি অটো লোডার ব্যবহার করতে হবে যা ক্লাসটির নাম নেবে (এই ক্ষেত্রে 'by' দিয়ে ব্রেক হবে) এবং এটি একটি ডিরেক্টরি কাঠামোতে ম্যাপ করবে।

আপনি এই নিবন্ধটি অটোলয়েডিংয়ে দেখে নিতে পারেন পিএইচপি- কার্যকারিতা সম্পর্কে । ফ্রেমওয়ার্কগুলিতে ইতিমধ্যে এই ধরণের কার্যকারিতার অনেকগুলি প্রয়োগ রয়েছে।

আমি আসলে একটি আগে বাস্তবায়ন করেছি। এখানে একটি লিঙ্ক


যদিও এটি নিয়ে সমস্যা আছে। এটি একটি পূর্ণ পথ তৈরির অনুমতি দেওয়ার জন্য এটি পুনরাবৃত্ত মডেল প্রয়োজন। এখনই এটি কেবলমাত্র একক স্তরের নেমস্পেসগুলি পরিচালনা করে।
টাইলার কার্টার

3

আমি গ্রিনের সাথে একমত, সিমফনির নাম স্থান প্রয়োজন, তাই কেন সেগুলি ব্যবহার করবেন না?

উদাহরণস্বরূপ নিয়ামক শ্রেণিটি এভাবে শুরু হয়:

নেমস্পেস একমে \ ডেমোবান্ডেল \ কন্ট্রোলার;

সিমফনি \ বান্ডিল \ ফ্রেমওয়ার্কবান্ডেল \ কন্ট্রোলার \ নিয়ামক ব্যবহার করুন;

ওয়েলসকন্ট্রোলার ক্লাস নিয়ামককে প্রসারিত করে {...}


3

আমি কি ক্লাস আমদানি করতে এটি ব্যবহার করতে পারি?

উপরের উদাহরণগুলি বাদ দিয়ে আপনি এটি করতে পারবেন না। আপনি useক্লাসের ভিতরে কীওয়ার্ডটি বৈশিষ্ট্যগুলি আমদানি করতে ব্যবহার করতে পারেন :

trait Stuff {
    private $baz = 'baz';
    public function bar() {
        return $this->baz;
    }
}

class Cls {
    use Stuff;  // import traits like this
}

$foo = new Cls;
echo $foo->bar(); // spits out 'baz'

3

useশব্দ পিএইচপি এলিয়াসিং জন্য এবং এটি ক্লাস আমদানি করে না। এটি সত্যই সহায়তা করে
) 1) আপনার যখন বিভিন্ন নেমস্পেসে একই নামের ক্লাস থাকে
2) বার বার সত্যিকারের দীর্ঘ শ্রেণীর নাম ব্যবহার করা থেকে বিরত থাকুন ।


2

শ্রেণি যেমন একটি নির্দিষ্ট ফাইলের পাথ নির্ধারণ করতে নেমস্পেস ব্যবহার করা হয়

namespace album/className; 

class className{
//enter class properties and methods here
}

এরপরে আপনি এই ব্যবহারটি "ব্যবহার" শব্দটি ব্যবহার করে এই নির্দিষ্ট শ্রেণিকে অন্য পিএইচপি ফাইলে অন্তর্ভুক্ত করতে পারেন:

use album/className;

class album extends classname {
//enter class properties and methods
}

দ্রষ্টব্য: ক্লাসযুক্ত ফাইলটি ব্যবহারের জন্য পথটি ব্যবহার করবেন না, কোনও বস্তুর তাত্ক্ষণিক ব্যবহারের জন্য প্রসারিত করুন তবে কেবলমাত্র নামস্থানটি ব্যবহার করুন।


2

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

<?php
    use foo\bar\lastPart;
    $obj=new lastPart\AnyClass(); //If there's not the line above, a fatal error will be encountered.
?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.