কঠোর প্রকারগুলি পিএইচপি-তে কী করে?


147

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

declare(strict_types = 1);

এটার কাজ কি? এটি আমার কোডকে কীভাবে প্রভাবিত করে? এটা কি আমার করা উচিত?

কিছু ব্যাখ্যা সুন্দর হবে।



5
এই কটাক্ষপাত .take খুব php.net/manual/en/... strict_types জন্য নির্দেশ
scaisEdge

উত্তর:


153

থেকে ট্রিহাউস ব্লগ :

পিএইচপি 7 সহ আমরা এখন স্কেলারের প্রকারগুলি যুক্ত করেছি। বিশেষত: ইনট, ফ্লোট, স্ট্রিং এবং বুল,

স্কেলারের ধরণের ইঙ্গিতগুলি যুক্ত করে এবং কঠোর প্রয়োজনীয়তা সক্ষম করে, আশা করা যায় যে আরও সঠিক এবং স্ব-ডকুমেন্টিং পিএইচপি প্রোগ্রামগুলি লেখা যেতে পারে। এটি আপনাকে আপনার কোডের উপর আরও নিয়ন্ত্রণ দেয় এবং কোডটি পড়া সহজ করে তোলে।

ডিফল্টরূপে, স্কেলার টাইপ-ডিক্লেয়ারেশনগুলি অ-কঠোর, যার অর্থ তারা টাইপ-ডিক্লেয়ারেশন দ্বারা নির্দিষ্ট ধরণের সাথে মেলে মূল প্রকারটি পরিবর্তনের চেষ্টা করবে। অন্য কথায়, আপনি যদি কোনও স্ট্রিং পাস করেন যা একটি নম্বর দিয়ে শুরু করে এমন একটি ফাংশনে যা ভাসমানের প্রয়োজন হয়, এটি শুরু থেকে নম্বরটি ধরে ফেলবে এবং সমস্ত কিছু সরিয়ে ফেলবে। কোনও ক্রিয়াকলাপের জন্য একটি ভাসমান স্থানটি প্রবেশ করানো হবে যার জন্য কোনও int প্রয়োজন হবে (1) int

ডিফল্টরূপে, পিএইচপি সম্ভব হলে প্রত্যাশিত স্কেলারের প্রকারে ভুল ধরণের মানগুলি ফেলে দেবে। উদাহরণস্বরূপ, কোনও ফাংশন যা পরামিতিটির জন্য একটি পূর্ণসংখ্যা দেওয়া হয় যা স্ট্রিংটি প্রত্যাশা করে যে টাইপ স্ট্রিংয়ের একটি ভেরিয়েবল পাবে।

কঠোর প্রকারগুলি অক্ষম করা হয়েছে ( স্পষ্ট ):

<?php

  function AddIntAndFloat(int $a, float $b) : int
  {
      return $a + $b;
  }

  echo AddIntAndFloat(1.4, '2');
  /*
  * without strict typing, PHP will change float(1.4) to int(1)
  * and string('2') to float(2.0) and returns int(3)
  */

প্রতি ফাইলের ভিত্তিতে কঠোর মোড সক্ষম করা সম্ভব। কঠোর মোডে, প্রকারের ঘোষণার ধরণের সঠিক ধরণের কেবল একটি পরিবর্তনীয় গ্রহণ করা হবে, বা কোনও টাইপ এরির নিক্ষেপ করা হবে। এই নিয়মের একমাত্র ব্যতিক্রম হ'ল কোনও ফ্লোট প্রত্যাশা করে কোনও ক্রিয়াকলাপ দেওয়া যেতে পারে। অভ্যন্তরীণ ফাংশনগুলির মধ্যে থেকে ফাংশন কলগুলি কঠোর_ টাইপ ঘোষণার দ্বারা প্রভাবিত হবে না।

কঠোর মোড সক্ষম করতে, ঘোষিত বিবৃতিটি কঠোর_প্রকারের ঘোষণার সাথে ব্যবহৃত হয়:

কঠোর প্রকারগুলি সক্ষম ( ইওল ):

<?php declare(strict_types=1);

  function AddIntAndFloat(int $a, float $b): int
  {
      return (string) $a + $b;
  }

  echo AddIntAndFloat(1.4,'2');
  // Fatal error: Uncaught TypeError: Argument 1 passed to AddIntAndFloat() must be of the type int, float given
  echo AddIntAndFloat(1,'2');
  // Fatal error: Uncaught TypeError: Argument 2 passed to AddIntAndFloat() must be of the type float, string given

  // Integers can be passed as float-points :
  echo AddIntAndFloat(1,1);
  // Fatal error: Uncaught TypeError: Return value of AddIntAndFloat() must be of the type integer, string returned

কাজের উদাহরণ:

<?php

declare(strict_types=1);

function AddFloats(float $a, float $b) : float
{
    return $a+$b;
}

$float = AddFloats(1.5,2.0); // Returns 3.5

function AddFloatsReturnInt(float $a, float $b) : int
{
    return (int) $a+$b;
}

$int = AddFloatsReturnInt($float,1.5); // Returns 5

function Say(string $message): void // As in PHP 7.2
{
    echo $message;
}

Say('Hello, World!'); // Prints "Hello, World!"

function ArrayToStdClass(array $array): stdClass
{
    return (object) $array;
}

$object = ArrayToStdClass(['name' => 'azjezz','age' => 100]); // returns an stdClass

function StdClassToArray(stdClass $object): array
{
    return (array) $object;
}

$array = StdClassToArray($object); // Returns array

function ArrayToObject(array $array): object // As of PHP 7.2
{
    return new ArrayObject($array);
}

function ObjectToArray(ArrayObject $object): array
{
    return $object->getArrayCopy();
}

var_dump( ObjectToArray( ArrayToObject( [1 => 'a' ] ) ) ); // array(1 => 'a');

3
আপনার কঠোর প্রকারের সক্ষম উদাহরণটিতে প্রথম মারাত্মক ত্রুটিটি ভুল। ডকুমেন্টেশনে যেমন উল্লেখ করা হয়েছে: "এই নিয়মের ব্যতিক্রম কেবলমাত্র একটি ফ্লোট প্রত্যাশা করে কোনও ক্রিয়াকলাপকে দেওয়া যেতে পারে" " ফাংশন কল ইনটায় ব্যর্থ হবে না। এটি স্ট্রিং উপর যদিও।
পল

63

strict_types ধরণের জবরদস্তি প্রভাবিত করে।

প্রকারের ইঙ্গিতগুলি ব্যবহার strict_typesনা করে সূক্ষ্ম বাগগুলি হতে পারে।

কঠোর ধরণের আগে, এর int $xঅর্থ " $xঅবশ্যই কোনও মানের জন্য সহজাতযোগ্য মান থাকতে হবে।" জোর করে নেওয়া যায় এমন কোনও মান intটাইপ ইঙ্গিতটি দিয়ে যায়, সহ:

  • সঠিকভাবে ( 242),
  • একটি ভাসা ( 10.17),
  • একটি বাল ( true),
  • null, বা
  • শীর্ষস্থানীয় অঙ্কগুলি ( "13 Ghosts") সহ একটি স্ট্রিং ।

সেট করে strict_types=1, আপনি ইঞ্জিনকে বলছেন যার int $xঅর্থ "$ x কেবলমাত্র একটি যথাযথ সঠিক হতে হবে, কোনও ধরণের জবরদস্তি অনুমোদিত নয়।" কোনও ধরণের রূপান্তর এবং সম্ভাব্য ক্ষতি ছাড়াই আপনি ঠিক এবং কেবল যা যা পেয়েছিলেন তা পেয়ে যাচ্ছেন বলে আপনার দুর্দান্ত নিশ্চয়তা রয়েছে।

উদাহরণ:

<?php
function get_quantity(): int {
    return '100 apples';
}
echo get_quantity() . PHP_EOL;

ফলন একটি সম্ভাব্য বিভ্রান্তিমূলক ফলাফল:

Notice: A non well formed numeric value encountered in /Users/bishop/tmp/pmkr-994/junk.php on line 4
100

বেশিরভাগ বিকাশকারী আশা করবেন, আমি মনে করি, int"কেবল একটি অন্তর্নিহিত" বোঝার ইঙ্গিত। তবে এটি হয় না, এর অর্থ "অন্তর্বাসের মতো কিছু"। কড়া_প্রকারগুলি সক্ষম করা সম্ভবত প্রত্যাশিত এবং পছন্দসই আচরণ দেয়:

<?php declare(strict_types=1);

function get_quantity(): int {
    return '100 apples';
}
echo get_quantity() . PHP_EOL;

উৎপাদনের:

Fatal error: Uncaught TypeError: Return value of get_quantity() must be of the type int, string returned in example.php:4

আমার মনে হয় এখানে দুটি পাঠ রয়েছে, যদি আপনি টাইপ ইঙ্গিতগুলি ব্যবহার করেন:

  • strict_types=1সর্বদা ব্যবহার করুন ।
  • বিজ্ঞপ্তিগুলি ব্যতিক্রমগুলিতে রূপান্তর করুন, আপনি যদি strict_typesপ্রগমা যোগ করতে ভুলে যান তবে ।

1
এটি প্রায় এক বছর আগের মত ইতিমধ্যে ভাল উত্তর দেওয়া হয়েছে;)
এমিক্স

6
প্রকৃতপক্ষে, আমি উত্তরটি ইমিক্সে উত্তরটি দিয়েছি। যাইহোক, আমি অনুভব করি যে "আমার উচিত এটি করা উচিত" এর প্রশ্নটি ছোঁয়া হয়নি। আমি আরও অনুভূত এবং সংঘাতজনক উদাহরণটি ব্যবহার করতে উত্সাহিত করবে বলে অনুভব করেছি strict_types
বিশপ 21

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