Có cách nào trong PHP để bao gồm một hằng trong một chuỗi mà không nối không?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
Có cách nào trong PHP để bao gồm một hằng trong một chuỗi mà không nối không?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
Câu trả lời:
Không.
Với String, PHP không có cách nào để phân biệt dữ liệu chuỗi ngoài các định danh không đổi. Điều này áp dụng cho bất kỳ định dạng chuỗi nào trong PHP, bao gồm cả heredoc.
constant()
là một cách khác để có được một hằng số, nhưng một lệnh gọi hàm không thể được đặt thành một chuỗi mà không cần nối.
define('ANIMAL','turtles'); $constant='constant'; echo "I like {$constant('ANIMAL')}";
Vâng, đó là (theo một cách nào đó;)):
define('FOO', 'bar');
$test_string = sprintf('This is a %s test string', FOO);
Đây có lẽ không phải là những gì bạn đang hướng tới, nhưng tôi nghĩ, về mặt kỹ thuật, đây không phải là sự kết hợp mà là sự thay thế và từ giả định này, nó bao gồm một hằng số trong một chuỗi mà không cần nối .
Để sử dụng hằng trong chuỗi, bạn có thể sử dụng phương pháp sau:
define( 'ANIMAL', 'turtles' );
$constant = 'constant';
echo "I like {$constant('ANIMAL')}";
Người ta có thể đặt bất kỳ tên hàm nào trong một biến và gọi nó với các tham số bên trong một chuỗi trích dẫn kép. Hoạt động với nhiều tham số quá.
$fn = 'substr';
echo "I like {$fn('turtles!', 0, -1)}";
Sản xuất
tôi thích rùa
Bạn cũng có thể sử dụng các hàm ẩn danh với điều kiện bạn đang chạy PHP 5.3+.
$escape = function ( $string ) {
return htmlspecialchars( (string) $string, ENT_QUOTES, 'utf-8' );
};
$userText = "<script>alert('xss')</script>";
echo( "You entered {$escape( $userText )}" );
Sản xuất thoát html đúng như mong đợi.
Nếu bây giờ bạn có ấn tượng rằng tên hàm có thể gọi được, thì đó không phải là trường hợp, vì một mảng trả về true khi được truyền vào is_callable
sẽ gây ra lỗi nghiêm trọng khi được sử dụng bên trong chuỗi:
class Arr
{
public static function get( $array, $key, $default = null )
{
return is_array( $array ) && array_key_exists( $key, $array )
? $array[$key]
: $default;
}
}
$fn = array( 'Arr', 'get' );
var_dump( is_callable( $fn ) ); // outputs TRUE
// following line throws Fatal error "Function name must be a string"
echo( "asd {$fn( array( 1 ), 0 )}" );
Cách làm này không được khuyến khích, nhưng đôi khi dẫn đến mã dễ đọc hơn nhiều, do đó tùy thuộc vào bạn - khả năng là có.
$_ = create_function('$a','return $a;'); $s = "I like {$_(ANIMAL)}"
. Phiên bản của Thetaiko loại bỏ sự cần thiết của dấu ngoặc kép và dấu gạch dưới rất dễ thương.
define( 'FOO', 'bar');
$FOO = FOO;
$string = "I am too lazy to concatenate $FOO in my string";
Nếu bạn thực sự muốn lặp lại hằng số mà không cần nối thì đây là giải pháp:
define('MY_CONST', 300);
echo 'here: ', MY_CONST, ' is a number';
lưu ý : trong ví dụ này, echo có một số tham số ( nhìn vào dấu phẩy ), vì vậy nó không phải là nối thực sự
Echo hoạt động như một hàm, cần nhiều tham số hơn, hiệu quả hơn so với ghép, bởi vì nó không phải nối và sau đó lặp lại, nó chỉ lặp lại mọi thứ mà không cần tạo đối tượng nối chuỗi mới :))
BIÊN TẬP
Ngoài ra nếu bạn xem xét concatenating chuỗi, passings chuỗi như thông số hoặc viết toàn bộ chuỗi với "The , (dấu phẩy version) luôn được nhanh nhất, tiếp theo đi . (Nối với ' dấu nháy đơn) và chuỗi chậm nhất phương pháp xây dựng đang sử dụng dấu ngoặc kép " , bởi vì các biểu thức được viết theo cách này phải được đánh giá theo các biến và hàm được khai báo ..
Cách dễ nhất là
define('MY_CONSTANT', 42);
$my_constant = MY_CONSTANT;
echo "This is my constant: $my_constant";
Một cách khác sử dụng (s)printf
define('MY_CONSTANT', 42);
// Note that %d is for numeric values. Use %s when constant is a string
printf('This is my constant: %d', MY_CONSTANT);
// Or if you want to use the string.
$my_string = sprintf('This is my constant: %d', MY_CONSTANT);
echo $my_string;
Như những người khác đã chỉ ra rằng bạn không thể làm điều đó. PHP có một chức năng constant()
không thể được gọi trực tiếp trong một chuỗi nhưng chúng ta có thể dễ dàng làm việc xung quanh vấn đề này.
$constant = function($cons){
return constant($cons);
};
và một ví dụ cơ bản về cách sử dụng của nó:
define('FOO', 'Hello World!');
echo "The string says {$constant('FOO')}";
$constant = 'constant';
thay vì xác định chức năng khác và nó sẽ hoạt động giống hệt vì chức năng đó đã tồn tại.
Dưới đây là một số lựa chọn thay thế cho các câu trả lời khác, dường như chủ yếu tập trung vào thủ thuật "{$}". Mặc dù không có đảm bảo nào được thực hiện về tốc độ của chúng; Đây là tất cả đường cú pháp tinh khiết. Đối với những ví dụ này, chúng tôi sẽ giả sử tập hợp các hằng số bên dưới được xác định.
define( 'BREAD', 'bread' ); define( 'EGGS', 'eggs' ); define( 'MILK', 'milk' );
Sử dụng trích xuất ()
Cái này là tốt vì kết quả là giống hệt với các biến. Đầu tiên bạn tạo một chức năng có thể sử dụng lại:
function constants(){ return array_change_key_case( get_defined_constants( true )[ 'user' ] ); }
Sau đó gọi nó từ bất kỳ phạm vi:
extract( constants() );
$s = "I need to buy $bread, $eggs, and $milk from the store.";
Ở đây, nó viết thường các hằng số để dễ dàng hơn trên ngón tay của bạn, nhưng bạn có thể xóa mảng_change_key_case () để giữ nguyên trạng. Nếu bạn đã có xung đột tên biến cục bộ, hằng số sẽ không ghi đè chúng.
Sử dụng thay thế chuỗi
Cái này tương tự như sprintf (), nhưng sử dụng một mã thông báo thay thế duy nhất và chấp nhận số lượng đối số không giới hạn. Tôi chắc chắn có nhiều cách tốt hơn để làm điều này, nhưng hãy tha thứ cho sự vụng về của tôi và cố gắng tập trung vào ý tưởng đằng sau nó.
Giống như trước đây, bạn tạo một chức năng có thể sử dụng lại:
function fill(){
$arr = func_get_args(); $s = $arr[ 0 ]; array_shift( $arr );
while( strpos( $s, '/' ) !== false ){
$s = implode( current( $arr ), explode( '/', $s, 2 ) ); next( $arr );
} return $s;
}
Sau đó gọi nó từ bất kỳ phạm vi:
$s = fill( 'I need to buy /, /, and / from the store.', BREAD, EGGS, MILK );
Bạn có thể sử dụng bất kỳ mã thông báo thay thế nào bạn muốn, như% hoặc #. Tôi đã sử dụng dấu gạch chéo ở đây vì nó dễ gõ hơn một chút.
Thật thú vị khi bạn có thể sử dụng từ khóa 'const' làm tên cho chức năng của mình để ngăn chặn việc xả rác không gian tên:
define("FOO","foo");
${'const'} = function($a){return $a;};
echo "{$const(FOO)}"; // Prints "foo"
echo const(FOO); // Parse error: syntax error, unexpected T_CONST
Bạn cũng có thể sử dụng $ GLOBALS để truyền bá chức năng 'const' trên toàn bộ mã:
$GLOBALS['const'] = function($a){return $a;};
Không chắc chắn là nó an toàn cho việc sử dụng trong tương lai. Và điều tồi tệ hơn - nó vẫn trông xấu xí.
Tôi tin rằng điều này trả lời câu hỏi ban đầu của OP. Điều duy nhất là khóa chỉ mục toàn cầu dường như chỉ hoạt động như chữ thường.
define('DB_USER','root');
echo "DB_USER=$GLOBALS[db_user]";
Đầu ra:
DB_USER=root
an associative array containing references to all variables
.
$db_user = 'root';