खोज…


वाक्य - विन्यास

  • फ़ंक्शन च (ClassName $ param) {}
  • समारोह च (बूल $ परम) {}
  • फ़ंक्शन च (इंट $ पैराम) {}
  • समारोह च (फ्लोट $ परम) {}
  • समारोह च (स्ट्रिंग $ परम) {}
  • समारोह च (स्वयं $ परम) {}
  • फ़ंक्शन च (कॉल करने योग्य $ परम) {}
  • समारोह च (सरणी $ परम) {}
  • समारोह f (? type_name $ param) {}
  • समारोह f (): type_name {}
  • समारोह f (): शून्य {}
  • समारोह f (): type_name {}

टिप्पणियों

टाइप हिंटिंग या टाइप डिक्लेरेशन एक रक्षात्मक प्रोग्रामिंग अभ्यास है जो सुनिश्चित करता है कि फ़ंक्शन के पैरामीटर एक निर्दिष्ट प्रकार के हैं। यह विशेष रूप से तब उपयोगी होता है जब एक इंटरफ़ेस के लिए टाइप किया जाता है क्योंकि यह फ़ंक्शन को यह गारंटी देता है कि प्रदान किए गए पैरामीटर में वही तरीके होंगे जो इंटरफ़ेस में आवश्यक हैं।

गलत प्रकार से एक संकेतित फ़ंक्शन को पास करने से एक घातक त्रुटि होगी:

घातक त्रुटि: बिना टाइप किए गए प्रकार: तर्क एक्स को foo () को पास करना आवश्यक प्रकार का होना चाहिए, बशर्ते कि दिया गया

स्केलिंग प्रकार, सरणियों और कॉलबिन को टाइप करें

कीवर्ड array साथ PHP 5.1 में टाइप हाइनिंग ऐरे पैरामीटर (और PHP 7.1 के बाद वापसी मान) के लिए समर्थन। किसी भी आयाम और प्रकार के किसी भी सरणियों, साथ ही खाली सरणियों, मान्य मान हैं।

PHP 5.4 में टाइप हिंटिंग कॉलबल्स के लिए समर्थन जोड़ा गया था। किसी भी मूल्य है कि is_callable() पैरामीटर और वापसी मान के लिए मान्य है संकेत दिया callable , यानी Closure वस्तुओं कार्यप्रणाली के नाम तार और array(class_name|object, method_name)

यदि टाइपो फ़ंक्शन नाम में होता है जैसे कि यह is_callable() , तो एक कम स्पष्ट त्रुटि संदेश प्रदर्शित किया जाएगा:

घातक त्रुटि: निर्विवाद टाइपर्रर: आर्ग्युमेंट 1 को foo () के लिए पास किया जाना चाहिए, जो टाइप करने योग्य, स्ट्रिंग / दिया जाना चाहिए

function foo(callable $c) {}
foo("count"); // valid
foo("Phar::running"); // valid
foo(["Phar", "running"); // valid
foo([new ReflectionClass("stdClass"), "getName"]); // valid
foo(function() {}); // valid

foo("no_such_function"); // callable expected, string given

नॉनस्टैटिक तरीकों को स्थिर प्रारूप में कॉलबल्स के रूप में भी पास किया जा सकता है, जिसके परिणामस्वरूप क्रमशः PHP 7 और 5 में एक व्रीकेशन चेतावनी और स्तर E_STRICT त्रुटि हो सकती है।

विधि दृश्यता को ध्यान में रखा जाता है। यदि callable करने callable पैरामीटर के साथ विधि के संदर्भ में उपलब्ध कॉल करने योग्य तक पहुंच नहीं है, तो यह समाप्त हो जाएगा जैसे कि विधि मौजूद नहीं है।

class Foo{
  private static function f(){
    echo "Good" . PHP_EOL;
  }

  public static function r(callable $c){
    $c();
  }
}

function r(callable $c){}

Foo::r(["Foo", "f"]);
r(["Foo", "f"]);

आउटपुट:

घातक त्रुटि: अनकट्र्ड टाइपर्रर: आर्ग्युमेंट 1 आर से पारित () कॉल करने योग्य होना चाहिए, दी गई सरणी

PHP 7 में टाइप हिन्टिंग स्केलर प्रकारों के लिए समर्थन जोड़ा गया था। इसका मतलब है कि हम boolean एस, integer एस, float एस और string एस के लिए टाइप हिंटिंग समर्थन प्राप्त करते हैं।

<?php

function add(int $a, int $b) {
    return $a + $b;
}

var_dump(add(1, 2)); // Outputs "int(3)"

डिफ़ॉल्ट रूप से, PHP अपने प्रकार के संकेत से मेल करने के लिए किसी भी प्रदान किए गए तर्क को डालने का प्रयास करेगा। add(1.5, 2) लिए कॉल को बदलना add(1.5, 2) बिल्कुल वही आउटपुट देता है, क्योंकि फ्लोट 1.5 को PHP द्वारा int में डाला गया था।

इस व्यवहार को रोकने के लिए, किसी को declare(strict_types=1); जोड़ना होगा declare(strict_types=1); हर PHP स्रोत फ़ाइल के शीर्ष पर जिसकी आवश्यकता होती है।

<?php

declare(strict_types=1);

function add(int $a, int $b) {
    return $a + $b;
}

var_dump(add(1.5, 2));

उपरोक्त स्क्रिप्ट अब एक घातक त्रुटि उत्पन्न करती है:

घातक त्रुटि: बिना टाइप किए गए प्रकार: तर्क 1 जोड़ने के लिए पारित () प्रकार पूर्णांक होना चाहिए, फ्लोट दिया गया

एक अपवाद: विशेष प्रकार

कुछ PHP फ़ंक्शन प्रकार resource का मान लौटा सकते हैं। चूंकि यह एक स्केलर प्रकार नहीं है, लेकिन एक विशेष प्रकार है, इसलिए इसे टाइप करना संभव नहीं है।

एक उदाहरण के रूप में, curl_init() एक resource लौटाएगा, साथ ही साथ fopen() । बेशक, वे दो संसाधन एक दूसरे के अनुकूल नहीं हैं। उसके कारण, PHP 7 हमेशा टाइप टाइप को फेंक देगा जब टाइपिंग resource स्पष्ट रूप से टाइप करें:

TypeError: नमूना के लिए दिया गया तर्क 1 () संसाधन, दिए गए संसाधन का एक उदाहरण होना चाहिए

सामान्य वस्तुओं को इंगित करने का प्रकार

चूंकि PHP ऑब्जेक्ट किसी बेस क्लास ( stdClass सहित) से विरासत में नहीं stdClass , इसलिए जेनेरिक ऑब्जेक्ट प्रकार को stdClass करने के लिए कोई समर्थन नहीं है।

उदाहरण के लिए, नीचे काम नहीं करेगा।

<?php

function doSomething(object $obj) {
    return $obj;
}

class ClassOne {}
class ClassTwo {}

$classOne= new ClassOne();
$classTwo= new ClassTwo();

doSomething($classOne);
doSomething($classTwo);

और एक घातक त्रुटि को फेंक देगा:

घातक त्रुटि: टाइप किए गए टाइपर: तर्क 1 doSomething को पारित () वस्तु का एक उदाहरण होना चाहिए, दिए गए OperationOne का उदाहरण

इसके लिए एक समाधान यह है कि एक पतित इंटरफ़ेस घोषित किया जाए जो बिना किसी तरीके को परिभाषित करता है, और आपके सभी ऑब्जेक्ट इस इंटरफ़ेस को लागू करते हैं।

<?php

interface Object {}

function doSomething(Object $obj) {
    return $obj;
}

class ClassOne implements Object {}
class ClassTwo implements Object {}

$classOne = new ClassOne();
$classTwo = new ClassTwo();

doSomething($classOne);
doSomething($classTwo);

हिंटिंग क्लास और इंटरफेस टाइप करें

PHP 5 में कक्षाओं और इंटरफेस के लिए टाइप हिंटिंग को जोड़ा गया था।

वर्ग प्रकार संकेत

<?php

class Student
{
    public $name = 'Chris';
}

class School
{
    public $name = 'University of Edinburgh';
}

function enroll(Student $student, School $school)
{
    echo $student->name . ' is being enrolled at ' . $school->name;
}

$student = new Student();
$school = new School();

enroll($student, $school);

उपरोक्त स्क्रिप्ट आउटपुट:

क्रिस को एडिनबर्ग विश्वविद्यालय में नामांकित किया जा रहा है


इंटरफ़ेस प्रकार संकेत

<?php

interface Enrollable {};
interface Attendable {};

class Chris implements Enrollable
{
    public $name = 'Chris';
}

class UniversityOfEdinburgh implements Attendable
{
    public $name = 'University of Edinburgh';
}

function enroll(Enrollable $enrollee, Attendable $premises)
{
    echo $enrollee->name . ' is being enrolled at ' . $premises->name;
}

$chris = new Chris();
$edinburgh = new UniversityOfEdinburgh();

enroll($chris, $edinburgh);

उपरोक्त उदाहरण पहले जैसा ही है:

क्रिस को एडिनबर्ग विश्वविद्यालय में नामांकित किया जा रहा है

स्वयं प्रकार संकेत

self कीवर्ड का उपयोग यह इंगित करने के लिए एक प्रकार के संकेत के रूप में किया जा सकता है कि मूल्य उस वर्ग का एक उदाहरण होना चाहिए जो विधि घोषित करता है।

टाइप हिंटिंग नो रिटर्न (शून्य)

PHP 7.1 में, void वापसी प्रकार जोड़ा गया था। जबकि PHP का कोई वास्तविक void मूल्य नहीं है, यह आम तौर पर प्रोग्रामिंग भाषाओं में समझा जाता है कि एक फ़ंक्शन जो कुछ भी नहीं देता है वह void । यह null लौटने के साथ भ्रमित नहीं होना चाहिए, क्योंकि null एक मूल्य है जिसे वापस किया जा सकता है।

function lacks_return(): void {
    // valid
}

ध्यान दें कि यदि आप एक void वापसी की घोषणा करते हैं, तो आप किसी भी मूल्य को वापस नहीं कर सकते हैं या आपको एक घातक त्रुटि मिलेगी:

function should_return_nothing(): void {
    return null; // Fatal error: A void function must not return a value
}

हालाँकि, फ़ंक्शन से बाहर निकलने के लिए रिटर्न का उपयोग करना मान्य है:

function returns_nothing(): void {
    return; // valid
}

अशक्त प्रकार के संकेत

पैरामीटर

Nullable type hint को PHP 7.1 में प्रयोग करके जोड़ा गया था ? प्रकार संकेत से पहले ऑपरेटर।

function f(?string $a) {}
function g(string $a) {}

f(null); // valid
g(null); // TypeError: Argument 1 passed to g() must be of the type string, null given

PHP 7.1 से पहले, यदि किसी पैरामीटर में एक प्रकार का संकेत है, तो इसे अशक्त मानों को स्वीकार करने के लिए डिफ़ॉल्ट मान null घोषित करना चाहिए।

function f(string $a = null) {}
function g(string $a) {}

f(null); // valid
g(null); // TypeError: Argument 1 passed to g() must be of the type string, null given

मान लौटाएं

PHP 7.0 में, वापसी प्रकार के साथ कार्य शून्य नहीं लौटना चाहिए।

PHP 7.1 में, फ़ंक्शन एक अशक्त रिटर्न प्रकार संकेत घोषित कर सकते हैं। हालाँकि, फ़ंक्शन को अभी भी शून्य होना चाहिए, शून्य नहीं (खाली / खाली विवरण नहीं)।

function f() : ?string {
    return null;
}

function g() : ?string {}
function h() : ?string {}

f(); // OK
g(); // TypeError: Return value of g() must be of the type string or null, none returned
h(); // TypeError: Return value of h() must be of the type string or null, none returned


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow