আমি পিএইচপি 5 ব্যবহার করছি এবং আমি অবজেক্ট-ভিত্তিক পদ্ধতির একটি নতুন বৈশিষ্ট্য পেয়েছি যার নাম 'মেথড চেইনিং'। এটা ঠিক কি? আমি কীভাবে এটি বাস্তবায়ন করব?
আমি পিএইচপি 5 ব্যবহার করছি এবং আমি অবজেক্ট-ভিত্তিক পদ্ধতির একটি নতুন বৈশিষ্ট্য পেয়েছি যার নাম 'মেথড চেইনিং'। এটা ঠিক কি? আমি কীভাবে এটি বাস্তবায়ন করব?
উত্তর:
এটি বরং সহজ সরল, আপনার কাছে এমন এক ধারাবাহিক মিউটর পদ্ধতি রয়েছে যা সমস্ত আসল (বা অন্যান্য) অবজেক্টগুলিকে ফেরত দেয়, এইভাবে আপনি ফিরে আসা অবজেক্টে কলিং পদ্ধতিগুলি রাখতে পারবেন।
<?php
class fakeString
{
private $str;
function __construct()
{
$this->str = "";
}
function addA()
{
$this->str .= "a";
return $this;
}
function addB()
{
$this->str .= "b";
return $this;
}
function getStr()
{
return $this->str;
}
}
$a = new fakeString();
echo $a->addA()->addB()->getStr();
এই ফলাফল "আব"
$foo->setBar(1)->setBaz(2)
বনাম $table->select()->from('foo')->where('bar = 1')->order('ASC)
। পরেরটি একাধিক বস্তু বিস্তৃত হয়।
$a = (new fakeString())->addA()->addB()->getStr();
মূলত, আপনি একটি জিনিস গ্রহণ:
$obj = new ObjectWithChainableMethods();
এমন একটি পদ্ধতি কল করুন যা কার্যকরভাবে return $this;
শেষের দিকে একটি করে:
$obj->doSomething();
যেহেতু এটি একই বস্তুটি, বা বরং একই বস্তুর রেফারেন্স দেয়, আপনি একই শ্রেণীর পদ্ধতিগুলি রিটার্ন মান থেকে দূরে রাখতে পারেন, যেমন:
$obj->doSomething()->doSomethingElse();
সত্যিই, এটি। দুটি গুরুত্বপূর্ণ বিষয়:
আপনি নোট হিসাবে, এটি শুধুমাত্র পিএইচপি 5। এটি পিএইচপি 4 এ সঠিকভাবে কাজ করবে না কারণ এটি মান অনুসারে বস্তুগুলি ফিরিয়ে দেয় এবং এর অর্থ আপনি কোনও অবজেক্টের বিভিন্ন অনুলিপিগুলিতে পদ্ধতিগুলি কল করছেন যা আপনার কোডটি ভেঙে দেবে।
আবার, আপনাকে আপনার শৃঙ্খলাবদ্ধ পদ্ধতিতে অবজেক্টটি ফিরিয়ে দিতে হবে:
public function doSomething() {
// Do stuff
return $this;
}
public function doSomethingElse() {
// Do more stuff
return $this;
}
return &$this
পিএইচপি 4 এ করতে পারেন ?
এই কোড ব্যবহার করে দেখুন:
<?php
class DBManager
{
private $selectables = array();
private $table;
private $whereClause;
private $limit;
public function select() {
$this->selectables = func_get_args();
return $this;
}
public function from($table) {
$this->table = $table;
return $this;
}
public function where($where) {
$this->whereClause = $where;
return $this;
}
public function limit($limit) {
$this->limit = $limit;
return $this;
}
public function result() {
$query[] = "SELECT";
// if the selectables array is empty, select all
if (empty($this->selectables)) {
$query[] = "*";
}
// else select according to selectables
else {
$query[] = join(', ', $this->selectables);
}
$query[] = "FROM";
$query[] = $this->table;
if (!empty($this->whereClause)) {
$query[] = "WHERE";
$query[] = $this->whereClause;
}
if (!empty($this->limit)) {
$query[] = "LIMIT";
$query[] = $this->limit;
}
return join(' ', $query);
}
}
// Now to use the class and see how METHOD CHAINING works
// let us instantiate the class DBManager
$testOne = new DBManager();
$testOne->select()->from('users');
echo $testOne->result();
// OR
echo $testOne->select()->from('users')->result();
// both displays: 'SELECT * FROM users'
$testTwo = new DBManager();
$testTwo->select()->from('posts')->where('id > 200')->limit(10);
echo $testTwo->result();
// this displays: 'SELECT * FROM posts WHERE id > 200 LIMIT 10'
$testThree = new DBManager();
$testThree->select(
'firstname',
'email',
'country',
'city'
)->from('users')->where('id = 2399');
echo $testThree->result();
// this will display:
// 'SELECT firstname, email, country, city FROM users WHERE id = 2399'
?>
পদ্ধতিতে শৃঙ্খলার অর্থ আপনি পদ্ধতি কলগুলি চেইন করতে পারেন:
$object->method1()->method2()->method3()
এর অর্থ হ'ল মেথড 1 () এর কোনও অবজেক্ট ফিরিয়ে দেওয়া দরকার এবং মেথড 2 () মেথড 1 () এর ফলাফল দেওয়া হয়। মেথড 2 () তারপরে রিটার্ন মানটি মেথিট 3 () এ পাস করে।
ভাল নিবন্ধ: http://www.talkphp.com/advanced-php-programming/1163-php5- স্মৃতিচর্চা- html
class Maker
{
private static $result = null;
private static $delimiter = '.';
private static $data = [];
public static function words($words)
{
if( !empty($words) && count($words) )
{
foreach ($words as $w)
{
self::$data[] = $w;
}
}
return new static;
}
public static function concate($delimiter)
{
self::$delimiter = $delimiter;
foreach (self::$data as $d)
{
self::$result .= $d.$delimiter;
}
return new static;
}
public static function get()
{
return rtrim(self::$result, self::$delimiter);
}
}
echo Maker::words(['foo', 'bob', 'bar'])->concate('-')->get();
echo "<br />";
echo Maker::words(['foo', 'bob', 'bar'])->concate('>')->get();
কোডের 49 টি লাইন রয়েছে যা আপনাকে এই জাতীয় অ্যারেগুলিতে পদ্ধতিগুলি চেইন করতে দেয়:
$fruits = new Arr(array("lemon", "orange", "banana", "apple"));
$fruits->change_key_case(CASE_UPPER)->filter()->walk(function($value,$key) {
echo $key.': '.$value."\r\n";
});
এই নিবন্ধটি দেখুন যা আপনাকে দেখায় যে কীভাবে পিএইচপি-র সমস্ত সত্তর অ্যারে_ ফাংশনগুলি চেইন করতে হয়।
http://domexception.blogspot.fi/2013/08/php-magic-methods-and-arrayobject.html
আপনি যদি জাভাস্ক্রিপ্টের মতো পদ্ধতিতে শৃঙ্খলা বোঝাতে চান (বা কিছু লোকেরা jQuery মনে রাখে), তবে কেন কেবল এমন একটি লাইব্রেরি নেওয়া উচিত নয় যা সেই দেবকে নিয়ে আসে। পিএইচপি অভিজ্ঞতা? উদাহরণস্বরূপ অতিরিক্ত - https://dsheiko.github.io/extras/ এটি একটি জাভাস্ক্রিপ্ট এবং আন্ডারস্কোর পদ্ধতি সহ পিএইচপি প্রকারগুলি প্রসারিত করে এবং শৃঙ্খলা সরবরাহ করে:
আপনি একটি নির্দিষ্ট ধরণের চেইন করতে পারেন:
<?php
use \Dsheiko\Extras\Arrays;
// Chain of calls
$res = Arrays::chain([1, 2, 3])
->map(function($num){ return $num + 1; })
->filter(function($num){ return $num > 1; })
->reduce(function($carry, $num){ return $carry + $num; }, 0)
->value();
অথবা
<?php
use \Dsheiko\Extras\Strings;
$res = Strings::from( " 12345 " )
->replace("/1/", "5")
->replace("/2/", "5")
->trim()
->substr(1, 3)
->get();
echo $res; // "534"
বিকল্পভাবে আপনি বহুরূপী যেতে পারেন:
<?php
use \Dsheiko\Extras\Any;
$res = Any::chain(new \ArrayObject([1,2,3]))
->toArray() // value is [1,2,3]
->map(function($num){ return [ "num" => $num ]; })
// value is [[ "num" => 1, ..]]
->reduce(function($carry, $arr){
$carry .= $arr["num"];
return $carry;
}, "") // value is "123"
->replace("/2/", "") // value is "13"
->then(function($value){
if (empty($value)) {
throw new \Exception("Empty value");
}
return $value;
})
->value();
echo $res; // "13"
নীচে আমার মডেল যা ডাটাবেসে আইডি দ্বারা সন্ধান করতে সক্ষম। ($ ডেটা) পদ্ধতিটি সম্পর্কের জন্য আমার অতিরিক্ত পরামিতি তাই আমি return এটি ফিরিয়ে দিই যা নিজেই এটি object আমার নিয়ামকটিতে আমি এটি চেইন করতে সক্ষম।
class JobModel implements JobInterface{
protected $job;
public function __construct(Model $job){
$this->job = $job;
}
public function find($id){
return $this->job->find($id);
}
public function with($data=[]){
$this->job = $this->job->with($params);
return $this;
}
}
class JobController{
protected $job;
public function __construct(JobModel $job){
$this->job = $job;
}
public function index(){
// chaining must be in order
$this->job->with(['data'])->find(1);
}
}