পিএইচপি-তে গতিশীল শ্রেণীর পদ্ধতি অনুরোধ


88

পিএইচপি-র জন্য একই শ্রেণিতে কোনও পদ্ধতিকে গতিশীলভাবে ডাকার কোনও উপায় আছে কি? আমার বাক্য গঠন ঠিক নেই, তবে আমি এর মতো কিছু করতে চাইছি:

$this->{$methodName}($arg1, $arg2, $arg3);

এটা কি আসল প্রশ্ন ছিল? আমি একটি পদ্ধতি ডায়নামিকভাবে চাওয়ার জন্য খুঁজছিলাম এবং আমি এই প্রশ্নটি পেয়েছি। এটি অ্যান্ডি ইউরিন দ্বারা প্রদত্ত একই বাক্য গঠন এবং আমি কোনও লিঙ্ক দেখতে পাচ্ছি না যা প্রশ্নের আপডেটটি দেখায়। যাইহোক ... জিজ্ঞাসা করার জন্য ধন্যবাদ এবং অবদানকারীদের ধন্যবাদ :-)
লুক এম

4
@ লুক - এটি আসল প্রশ্ন ছিল। দেখা যাচ্ছে যে আমি যখন জিজ্ঞাসা করেছি তখন আমার বাক্য গঠন ঠিক ছিল, তবে আমার কোডটিতে অন্য কিছু ছিল তাই এটি কার্যকর হয়নি।
ভার্টুওসিমিডিয়া

উত্তর:


176

এটি করার একাধিক উপায় রয়েছে:

$this->{$methodName}($arg1, $arg2, $arg3);
$this->$methodName($arg1, $arg2, $arg3);
call_user_func_array(array($this, $methodName), array($arg1, $arg2, $arg3));

এমনকি আপনি প্রতিচ্ছবি এপিআই http://php.net/manual/en/class.reflection.php ব্যবহার করতে পারেন


আমার ধারণা আমি সম্ভবত বাক্য গঠনটি সঠিকভাবে করেছি, তাই আমার কোডটিতে অন্য কিছু ভুল কারণ এটি সঠিকভাবে কার্যকর হচ্ছে না। হুম ...
ভার্টুওসিমিডিয়া

ক্লান্তদের কাছে একটি শব্দ, যদি আপনার পদ্ধতিগুলি অবজেক্টগুলিতে ডাকা হয় এবং পিএইচপিউনিট দিয়ে পরীক্ষা করা হয় তবে call_user_func_arrayএটি আপনার জন্য একটি।
ঠিক আছে নিশ্চিত

আপনি আমার বন্ধু, আমার দিনটি বাঁচিয়েছেন! আমি ফোন করে call_user_func_array($this->$name, ...)ভাবছিলাম কেন এটি কাজ করবে না!
পুবুডু দোডাঙ্গোদা


10

আপনি পিএইচপিতে ওভারলোডিং : ওভারলোডিং ব্যবহার করতে পারেন

class Test {

    private $name;

    public function __call($name, $arguments) {
        echo 'Method Name:' . $name . ' Arguments:' . implode(',', $arguments);
        //do a get
        if (preg_match('/^get_(.+)/', $name, $matches)) {
            $var_name = $matches[1];
            return $this->$var_name ? $this->$var_name : $arguments[0];
        }
        //do a set
        if (preg_match('/^set_(.+)/', $name, $matches)) {
            $var_name = $matches[1];
            $this->$var_name = $arguments[0];
        }
    }
}

$obj = new Test();
$obj->set_name('Any String'); //Echo:Method Name: set_name Arguments:Any String
echo $obj->get_name();//Echo:Method Name: get_name Arguments:
                      //return: Any String


3

আপনি যদি পিএইচপি-র কোনও শ্রেণীর মধ্যে কাজ করছেন, তবে আমি পিএইচপি 5-তে ওভারলোডযুক্ত __call ফাংশনটি ব্যবহার করার পরামর্শ দেব। আপনি এখানে রেফারেন্স খুঁজে পেতে পারেন

মূলত __call গতিশীল ফাংশনগুলির জন্য করে __ সেট এবং __get ওও পিএইচপি 5 এর চলকগুলির জন্য কী করে।


2

এত বছর পরেও বৈধ! নিশ্চিত করুন যে আপনি ব্যবহারকারীর সংজ্ঞায়িত সামগ্রী যদি $ মেথডনামটি ছাঁটাই করেন। আমি লক্ষ্য করি না এটির একটি অগ্রণী স্থান না পাওয়া পর্যন্ত আমি এই> এই -> $ পদ্ধতি নামটি কাজ করতে পারি না।


যদি এটির ব্যবহারকারীর সংজ্ঞা দেওয়া সামগ্রীগুলি নিশ্চিত করে নিন যে আপনি কেবল নামটি ছাঁটাই করা ছাড়াও আরও অনেক কিছু করছেন! যেমন ... সুরক্ষা এটি পরীক্ষা করুন! ;)
এর্ক

ইন্টারনেটের কোথাও, আমি কীভাবে ব্যবহারকারীর দ্বারা ইউটিএফ 8 প্রবেশ করে উইন্ডোজ-সুরক্ষিত অক্ষরে রূপান্তর করতে হবে তা বিশদ করেছি। কুইকবুকস আমাকে সেই রিংয়ের মধ্য দিয়ে চালিয়েছিল - এবং কেন আমি কীভাবে বিক্রয় বিক্রয় শেষ করব তা কেন QB অংশ নয় ...
ক্রিস কে

আপনি কি ক্লায়েন্টকে কোনও ইনপুট নির্দিষ্ট করার অনুমতি দিচ্ছেন, সেই কলটি ডায়নামিকভাবে কিছু পদ্ধতি !? আমার কোনও শব্দ নেই
ম্যাকস্কি

স্পষ্টতই যাচাই করা হয়েছে এবং পরীক্ষা করা হয়েছে যে ক্লাসে আসলে এইরকম একটি নামকৃত পদ্ধতি রয়েছে। মানটি পরীক্ষা করার বিভিন্ন উপায় রয়েছে ways এটি একটি দীর্ঘ সুইচ বিবৃতি প্রহার করে।
স্নেপি

1

আমার ক্ষেত্রে.

$response = $client->{$this->requestFunc}($this->requestMsg);

পিএইচপি সোপ ব্যবহার করা হচ্ছে।


4
আমি নিশ্চিত নই তবে সুরক্ষা সমস্যা সম্পর্কে সতর্ক
থাকি

1

আপনি ক্লোজারটি ব্যবহার করে একটি পদ্ধতি একটি একক ভেরিয়েবলে সঞ্চয় করতে পারেন:

class test{        

    function echo_this($text){
        echo $text;
    }

    function get_method($method){
        $object = $this;
        return function() use($object, $method){
            $args = func_get_args();
            return call_user_func_array(array($object, $method), $args);           
        };
    }
}

$test = new test();
$echo = $test->get_method('echo_this');
$echo('Hello');  //Output is "Hello"

সম্পাদনা: আমি কোডটি সম্পাদনা করেছি এবং এখন এটি পিএইচপি 5.3 এর সাথে সামঞ্জস্যপূর্ণ। এখানে আরও একটি উদাহরণ

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