2012-01-22 37 views
13

Tôi đang thực hiện một hàm với các loại đối số được khai báo để kiểm tra nhanh nếu chúng ở định dạng phù hợp nhưng khi nào chuỗi trả về allways lỗi Lỗi chết người có thể truy cập: Đối số 2 đã qua để myfunction() phải là một thể hiện của chuỗi, chuỗi nhất định, gọi là trong path_to_file trên dòng 69 và quy định tại path_to_file trên đường dây 49php: Khai báo loại đối số của hàm

function myfunction(array $ARRAY, string $STRING, int $INTEGER) { 
    return "Args format correct"; 
} 
myfunction(array("1",'2','3','4'), "test" , 1234); 

đâu là sai lầm?

+0

Bạn không thể gợi ý của các giá trị vô hướng. – alexn

+1

Bây giờ bạn có thể, chỉ cần sử dụng PHP 7.0 http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration – sobi3ch

Trả lời

29

Theo the PHP5 documentation:

Type Hints can only be of the object and array (since PHP 5.1) type. Traditional type hinting with int and string isn't supported.

Kể từ stringint không lớp học, bạn có thể không phải là "kiểu gợi ý" chúng trong chức năng của bạn.

Kể từ loại đối số khai báo PHP 7.0 dưới dạng chuỗi, int, float, bool được hỗ trợ.

+5

câu trả lời này đã lỗi thời, hãy xem http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration – Blauhirn

0

Bạn không thể xác định loại là stringint. PHP "không biết" chúng là gì.

+3

Nó không biết các loại, [nó chỉ không quan tâm] (http://en.wikipedia.org/wiki/Type_system#Strong_and_weak_typing). – Gumbo

+1

@Gumbo ...và đó là lý do tại sao tôi đặt dấu ngoặc kép ... –

1

string, int và khác tích hợp trong các loại không lớp, trong lập luận bạn chỉ định lớp, trong những cuộc tranh cãi. Loại được cài sẵn chỉ được hỗ trợ để đặt ở đó là array.

6

Bạn có thể làm một cái gì đó như thế này mà đã luôn luôn làm việc cho tôi

cho chuỗi

function setData($Name=""){ } 

này buộc tên là một chuỗi, nó không kiểm tra xem nó một chuỗi

cho các giá trị số

function setData($age=0){ } 

này buộc tuổi phải là số, nếu một chuỗi được thông qua, giá trị sẽ là 0

cho các giá trị mảng, có hai biến thể

function setData(array $data){ } 

nếu một mảng không được thông qua, nó sẽ ném ra một lỗi

function setData($data=array()){ } 

sẽ này chuyển một mảng trống không có giá trị nào được cung cấp cho $data

+4

Chỉ định giá trị mặc định cho đối số là một kỹ thuật quan trọng nhưng không nên được đánh đồng với loại gợi ý. Ví dụ, không hoàn toàn đúng khi chỉ định 'func ($ x = 0)' buộc giá trị của '$ x' là một số. Thay vào đó, nếu hàm của bạn luôn xử lý giá trị của '$ x' như một số trong suốt, thì trùng hợp nó hoạt động. Trên thực tế, nếu bạn chuyển vào một chuỗi có thể phân tích cú pháp dưới dạng một số thì chuỗi đó sẽ được xử lý theo cách đó. 'func ('5')' sẽ vui vẻ sử dụng 5 làm giá trị số nguyên. Một chuỗi không phân tích cú pháp được hiểu là không, vì vậy mặc định 0 của bạn hoạt động theo sự trùng hợp ngẫu nhiên. – zerobandwidth

0

Nếu bạn không sử dụng PHP 7.x hoặc cần một số xác thực đối số phức tạp (như "mảng hoặc \ T có thể đảo ngược "vì bạn có thể duyệt qua các mảng nhưng chúng là các kiểu nguyên thủy và không triển khai giao diện \ Traversable), bạn có thể sử dụng mô-đun args từ Non-standard PHP library (NSPL).

use const \nspl\args\numeric; 
use function \nspl\args\expects; 

function sqr($x) 
{ 
    expects(numeric, $x); 
    return $x * $x; 
} 

sqr('hello world'); 

Đầu ra:

InvalidArgumentException: Argument 1 passed to sqr() must be numeric, string given in /path/to/example.php on line 17 

Call Stack: 
    0.0002  230304 1. {main}() /path/to/example.php:0 
    0.0023  556800 2. sqr() /path/to/example.php:17 
0

Theo PHP Manual, trong PHP 5.x bạn không thể sử dụng array như gợi ý, nhưng trong PHP 7.xbạn có thể! Hãy xem:

  • Class/interface name Tham số phải là phiên bản của lớp hoặc tên giao diện đã cho. PHP 5.0.0
  • self Tham số phải là một instanceof lớp giống như một phương pháp được định nghĩa trên. Điều này chỉ có thể được sử dụng trên các phương thức lớp và thể hiện. PHP 5.0.0
  • array Tham số phải là một mảng. PHP 5.1.0
  • callable Thông số phải hợp lệ. PHP 5.4.0
  • bool Tham số phải là giá trị logic. PHP 7.0.0
  • float Thông số phải là số dấu phẩy động. PHP 7.0.0
  • int Tham số phải là số nguyên. PHP 7.0.0
  • string Tham số phải là một chuỗi. PHP 7.0.0
  • iterable Tham số phải là mảng hoặc thể hiện của Traversable. PHP 7.1.0
0

khi tôi cần sử dụng Loại gợi ý, tôi làm điều này:

<?php 
declare(strict_types=1); 
+1

Vui lòng thêm mô tả khác về câu trả lời của bạn. –

Các vấn đề liên quan