The documentation does not mention, but a closing semicolon at the end of the heredoc is actually interpreted as a real semicolon, and as such, sometimes leads to syntax errors.
This works:
<?php
$foo = <<<END
abcd
END;
?>
This does not:
<?php
foo(<<<END
abcd
END;
);
// syntax error, unexpected ';'
?>
Without semicolon, it works fine:
<?php
foo(<<<END
abcd
END
);
?>Низи
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Низи
Референца за `language.types.string.php` со подобрена типографија и навигација.
Низи
А string is a series of characters, where a character is the same as a byte. This means that PHP only supports a 256-character set, and hence does not offer native Unicode support. See е серија од знаци, каде што знакот е ист како бајт. Ова значи дека PHP поддржува само сет од 256 знаци, и оттука не нуди нативна поддршка за Unicode. Види.
Забелешка: детали за типот на стринг string На 32-битни градби, а
Синтакса
А string може да биде голем до 2GB (максимум 2147483647 бајти)
- Нормално е препорачливо овие параметри да се поминат како
- стринг. Ако користите
- heredoc синтакса
- литерал може да се специфицира на четири различни начини:
nowdoc синтакса
Едноставно цитиран string Наједноставниот начин да се специфицира а ').
е да се стави во единечни наводници (знакот\За да специфицирате единечен наводник, избегајте го со обратна коса црта ("). За да специфицирате обратна коса црта, удвојте ја (\). Сите други појави на обратна коса црта ќе се третираат како обична обратна коса црта: ова значи дека другите секвенци за бегство на кои можеби сте навикнати, како што се\\, ќе бидат прикажани буквално како што се специфицирани наместо да имаат какво било посебно значење. \r or \nсинтакси,
Забелешка: За разлика од double-quoted and heredoc и секвенци за бегство за специјални знаци ќе variables се прошират кога ќе се појават во единечни наводници not Пример #1 Варијанти на синтакса strings.
Nowdoc
<?php
echo 'this is a simple string', PHP_EOL;
echo 'You can also have embedded newlines in
strings this way as it is
okay to do', PHP_EOL;
// Outputs: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"', PHP_EOL;
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?', PHP_EOL;
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?', PHP_EOL;
// Outputs: This will not expand: \n a newline
echo 'This will not expand: \n a newline', PHP_EOL;
// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either', PHP_EOL;
?>Двојно наводници
Ако string е затворено во двојни наводници ("), PHP ќе ги интерпретира следните секвенци за бегство за специјални знаци:
| Секвенца | Значење |
|---|---|
\n |
нов ред (LF или 0x0A (10) во ASCII) |
\r |
враќање на количка (CR или 0x0D (13) во ASCII) |
\t |
хоризонтална табулација (HT или 0x09 (9) во ASCII) |
\v |
вертикална табулација (VT или 0x0B (11) во ASCII) |
\e |
бегство (ESC или 0x1B (27) во ASCII) |
\f |
хранење на формуларот (FF или 0x0C (12) во ASCII) |
\\ |
backslash |
\$ |
знак за долар |
\" |
double-quote |
\[0-7]{1,3} |
Октално: секвенцата од знаци што одговара на регуларниот израз [0-7]{1,3}
е знак во октална нотација (на пр. "\101" === "A"), што тивко прелева за да се вклопи во бајт (на пр. "\400" === "\000")
|
\x[0-9A-Fa-f]{1,2} |
Хексадецимално: секвенцата од знаци што одговара на регуларниот израз
[0-9A-Fa-f]{1,2} е знак во хексадецимална нотација (на пр. "\x41" === "A")
|
\u{[0-9A-Fa-f]+} |
Unicode: секвенцата од знаци што одговара на регуларниот израз [0-9A-Fa-f]+
е кодна точка на Unicode, која ќе биде прикажана во низата како UTF-8 претставување на таа кодна точка. Заградите се задолжителни во низата. На пр. "\u{41}" === "A"
|
е Unicode точка на кодирање, која ќе биде прикажана во низата како UTF-8 претставување на таа точка на кодирање. Заградите се задолжителни во низата. На пр. stringКако во единечни наводници
s, избегнувањето на кој било друг знак ќе резултира со печатење на обратна коса црта. stringНајважната карактеристика на двојни наводници s е фактот дека имињата на променливите ќе бидат проширени. Видете интерполација на низи
за детали.
Heredoc stringТрет начин за разграничување
<<<s е heredoc синтаксата: string . По овој оператор, се дава идентификатор, потоа нов ред. Самиот
следи, а потоа истиот идентификатор повторно за затворање на наводникот. must Затворачкиот идентификатор може да биде вовлечен со празно место или табулатор, во тој случај вовлекувањето ќе биде отстрането од сите редови во низата. Пред PHP 7.3.0, затворачкиот идентификатор
мора да започне во првата колона од редот.
Исто така, затворачкиот идентификатор мора да ги следи истите правила за именување како и секоја друга ознака во PHP: мора да содржи само алфанумерички знаци и подвлекувања, и мора да започне со не-цифрен знак или подвлекување.
<?php
// no indentation
echo <<<END
a
b
c
\n
END;
// 4 spaces of indentation
echo <<<END
a
b
c
END;Пример #2 Основен Heredoc пример од PHP 7.3.0
a
b
c
a
b
c
Излез од горниот пример во PHP 7.3: ParseError Ако затворачкиот идентификатор е вовлечен повеќе од кој било ред од телото, тогаш ќе биде фрлена
грешка:
<?php
echo <<<END
a
b
c
END;Пример #2 Основен Heredoc пример од PHP 7.3.0
Parse error: Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4
Ако завршниот идентификатор е вовлечен, може да се користат и табулатори, но табулаторите и празнините Ако завршниот идентификатор е вовлечен, може да се користат и табулатори, но табулаторите и празнините не смеат ParseError да се мешаат во однос на вовлекувањето на завршниот идентификатор и вовлекувањето на телото (до завршниот идентификатор). Во која било од овие случаи, ќе биде фрлено
ќе биде фрлено. Овие ограничувања за празни места се вклучени бидејќи мешањето на табулатори и празни места за вовлекување е штетно за читливоста.
<?php
// All the following code do not work.
// different indentation for body (spaces) ending marker (tabs)
{
echo <<<END
a
END;
}
// mixing spaces and tabs in body
{
echo <<<END
a
END;
}
// mixing spaces and tabs in ending marker
{
echo <<<END
a
END;
}Пример #2 Основен Heredoc пример од PHP 7.3.0
Parse error: Invalid indentation - tabs and spaces cannot be mixed in example.php line 8
Пример #4 Различно вовлекување за телото (празни места) завршен идентификатор
Завршниот идентификатор за низата на телото не е задолжително да биде проследен со точка и запирка или нов ред. На пример, следниов код е дозволен од PHP 7.3.0:
<?php
$values = [<<<END
a
b
c
END, 'd e f'];
var_dump($values);Пример #2 Основен Heredoc пример од PHP 7.3.0
array(2) {
[0] =>
string(11) "a
b
c"
[1] =>
string(5) "d e f"
}
Пример #5 Продолжување на израз по завршен идентификатор ParseError.
Ако завршниот идентификатор беше пронајден на почетокот на линијата, тогаш без оглед на тоа дали беше дел од друг збор, тој може да се смета како завршен идентификатор и предизвикува
<?php
$values = [<<<END
a
b
END ING
END, 'd e f'];Пример #2 Основен Heredoc пример од PHP 7.3.0
Parse error: syntax error, unexpected identifier "ING", expecting "]" in example.php on line 5
Пример #6 Завршниот идентификатор во телото на низата има тенденција да предизвика ParseError За да се избегне овој проблем, безбедно е да се следи едноставното правило:.
не избирајте збор што се појавува во телото на текстот како завршен идентификатор;Пред PHP 7.3.0, многу е важно да се напомене дека линијата со завршниот идентификатор не смее да содржи други знаци, освен точка и запирка ("."). Тоа особено значи дека идентификаторот
не смее да биде вовлечен", и не смее да има празни места или табулатори пред или по точката и запирка. Исто така е важно да се сфати дека првиот знак пред завршниот идентификатор мора да биде нов ред како што е дефинирано од локалниот оперативен систем. Ова е \n на UNIX системи, вклучувајќи го и macOS. Завршниот разделник исто така мора да биде проследен со нов ред.
Ако ова правило е прекршено и завршниот идентификатор не е „чист“, тој нема да се смета за завршен идентификатор, а PHP ќе продолжи да бара еден. Ако не се најде соодветен завршен идентификатор пред крајот на тековната датотека, ќе резултира со грешка при парсирање на последната линија.
Пример #7 Невалиден пример, пред PHP 7.3.0
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
// Identifier must not be indented
?>Пример #8 Валиден пример, дури и пред PHP 7.3.0
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>Heredocs што содржат променливи не можат да се користат за иницијализирање на својства на класа.
Heredoc текстот се однесува исто како стринг со двојни наводници, без двојните наводници. Ова значи дека наводниците во heredoc не треба да се избегнуваат, но кодовите за бегство наведени погоре сепак можат да се користат. Променливите се прошируваат, но истото внимание мора да се посвети при изразување сложени променливи во heredoc како и со string, без двојните наводници. Ова значи дека наводниците во heredoc не треба да се избегнуваат, но кодовите за бегство наведени погоре сепак можат да се користат. Променливите се прошируваат, но истото внимание мора да се посвети при изразување сложени променливи во heredoc како и со strings.
Пример #9 Пример за цитирање heredoc стринг
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
/* More complex example, with variables. */
class foo
{
var $foo;
var $bar;
function __construct()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
My name is "MyName". I am printing some Foo. Now, I am printing some Bar2. This should print a capital 'A': A
Можно е да се користи heredoc синтаксата за предавање податоци на аргументи на функции:
Пример #10 Heredoc во аргументи пример
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>Можно е да се иницијализираат статички променливи и својства/константи на класа користејќи heredoc синтакса:
Пример #11 Користење на Heredoc за иницијализирање статички вредности
<?php
// Static variables
function foo()
{
static $bar = <<<LABEL
Nothing in here...
LABEL;
}
// Class properties/constants
class foo
{
const BAR = <<<FOOBAR
Constant example
FOOBAR;
public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>Идентификаторот за отворање на Heredoc може опционално да биде затворен во двојни наводници:
Пример #12 Користење на двојни наводници во Heredoc
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>Nowdoc
Nowdocs се како стринг со единечни наводници што heredocs се за стринг со двојни наводници. Nowdoc е специфициран слично како heredoc, но нема интерполација на стринг внатре во nowdoc. Конструктот е идеален за вградување PHP код или други големи блокови текст без потреба од бегство. Споделува некои карактеристики со SGML
<![CDATA[ ]]> конструкт, во смисла дека декларира блок текст кој не е за парсирање.
Nowdoc е идентификуван со истиот <<<
секвенца што се користи за heredocs, но идентификаторот што следи е затворен во единечни наводници, на пр. <<<'EOT'. Сите правила за heredoc идентификатори исто така важат и за nowdoc идентификатори, особено оние што се однесуваат на појавата на затворачкиот идентификатор.
Пример #13 Пример за цитирање nowdoc стринг
<?php
echo <<<'EOD'
Example of string spanning multiple lines
using nowdoc syntax. Backslashes are always treated literally,
e.g. \\ and \'.
EOD;Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Example of string spanning multiple lines using nowdoc syntax. Backslashes are always treated literally, e.g. \\ and \'.
Пример #14 Пример за цитирање nowdoc стринг со променливи
<?php
class foo
{
public $foo;
public $bar;
function __construct()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41Пример #15 Пример за статички податоци
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>Интерполација на низа
Кога е string наведено во двојни наводници или со heredoc, variables може да се замени во него.
Постојат два вида на синтакса: а basic една и advanced една. Основната синтакса е најчеста и најзгодна. Обезбедува начин за вградување на променлива, вредност на array или object својство во string со минимален напор.
Основен синтакс
Ако се сретне знак за долар ($) се сретне, знаците што следат по него, а кои можат да се користат во име на променлива, ќе се толкуваат како такви и ќе се заменат.
Пример #16 Интерполација на низа
<?php
$juice = "apple";
echo "He drank some $juice juice." . PHP_EOL;
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
He drank some apple juice.
Формално, структурата за основната синтакса за замена на променливи е следнава:
string-variable::
variable-name (offset-or-property)?
| ${ expression }
offset-or-property::
offset-in-string
| property-in-string
offset-in-string::
[ name ]
| [ variable-name ]
| [ integer-literal ]
property-in-string::
-> name
variable-name::
$ name
name::
[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*
На ${ expression } синтаксата е застарена од PHP 8.2.0, бидејќи може да се толкува како
(низа):
<?php
const foo = 'bar';
$foo = 'foo';
$bar = 'bar';
var_dump("${foo}");
var_dump("${(foo)}");
?>Излез од горниот пример во PHP 8.2:
Deprecated: Using ${var} in strings is deprecated, use {$var} instead in file on line 6
Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in file on line 9
string(3) "foo"
string(3) "bar"
Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
string(3) "foo" string(3) "bar"
Забелешка: Ако не е можно да се формира валидно име, знакот за долар останува како што е во низата:
<?php
echo "No interpolation $ has happened\n";
echo "No interpolation $\n has happened\n";
echo "No interpolation $2 has happened\n";
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
No interpolation $ has happened No interpolation $ has happened No interpolation $2 has happened
Пример #17 Интерполирање на вредноста на првата димензија на низа или својство
<?php
$juices = array("apple", "orange", "string_key" => "purple");
echo "He drank some $juices[0] juice.";
echo PHP_EOL;
echo "He drank some $juices[1] juice.";
echo PHP_EOL;
echo "He drank some $juices[string_key] juice.";
echo PHP_EOL;
class A {
public $s = "string";
}
$o = new A();
echo "Object value: $o->s.";
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
He drank some apple juice. He drank some orange juice. He drank some purple juice. Object value: string.
Забелешка: Клучот на низата мора да биде без наводници, и затоа не е можно да се повика константа како клуч со основната синтакса. Користете ја advanced синтаксија наместо тоа.
Од PHP 7.1.0 исто така negative поддржани се нумерички индекси.
Пример #18 Негативни нумерички индекси
<?php
$string = 'string';
echo "The character at index -2 is $string[-2].", PHP_EOL;
$string[-3] = 'o';
echo "Changing the character at index -3 to o gives $string.", PHP_EOL;
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
The character at index -2 is n. Changing the character at index -3 to o gives strong.
За нешто посложено, advanced синтаксија мора да се користи.
Напредна (кадрава) синтаксија
Напредната синтаксија дозволува интерполација на variables со произволни пристапници.
Било која скаларна променлива, елемент на низа или својство на објект (static или не) со
string претстава може да се вклучи преку оваа синтаксија. Изразот се пишува на ист начин како што би се појавил надвор од
string, а потоа се завиткува во { and
}. Бидејќи { не може да се избега, оваа синтаксија ќе биде препознаена само кога $ непосредно следи {. Користете {\$ за да добиете буквален {$. Некои примери за да биде јасно:
Пример #19 Кадрава Синтакса
<?php
const DATA_KEY = 'const-key';
$great = 'fantastic';
$arr = [
'1',
'2',
'3',
[41, 42, 43],
'key' => 'Indexed value',
'const-key' => 'Key with minus sign',
'foo' => ['foo1', 'foo2', 'foo3']
];
// Won't work, outputs: This is { fantastic}
echo "This is { $great}";
// Works, outputs: This is fantastic
echo "This is {$great}";
class Square {
public $width;
public function __construct(int $width) { $this->width = $width; }
}
$square = new Square(5);
// Works
echo "This square is {$square->width}00 centimeters wide.";
// Works, quoted keys only work using the curly brace syntax
echo "This works: {$arr['key']}";
// Works
echo "This works: {$arr[3][2]}";
echo "This works: {$arr[DATA_KEY]}";
// When using multidimensional arrays, always use braces around arrays
// when inside of strings
echo "This works: {$arr['foo'][2]}";
echo "This works: {$obj->values[3]->name}";
echo "This works: {$obj->$staticProp}";
// Won't work, outputs: C:\directory\{fantastic}.txt
echo "C:\directory\{$great}.txt";
// Works, outputs: C:\directory\fantastic.txt
echo "C:\\directory\\{$great}.txt";
?>Забелешка: Бидејќи овој синтаксен дозволува произволни изрази, можно е да се користи (низа) Бидејќи овој синтакс овозможува произволни изрази, можно е да се користи
во напредниот синтакс.
Пристап и измена на стринг по карактер stringКарактерите во string може да се пристапат и да се изменат со специфицирање на нулто-базираниот офсет на посакуваниот карактер по array со користење на квадратни $str[42]загради, како во string . Замислете array како substr() and substr_replace() низа од карактери за оваа цел. Функциите
Забелешка: може да се користат кога сакате да извлечете или замените повеќе од 1 карактер.
E_NOTICEОд PHP 7.1.0, поддржани се и негативни офсети на стринг. Овие специфицираат офсет од крајот на стрингот. Претходно, негативните офсети емитувааE_WARNINGза читање (враќајќи празен стринг) и
Забелешка: за пишување (оставјајќи го стрингот недопрен). stringПред PHP 8.0.0, $str{42}можеше да се пристапи и со користење на загради, како во
, за истата цел. Овој синтакс со загради беше отфрлен од PHP 7.4.0 и повеќе не се поддржува од PHP 8.0.0. E_WARNINGПишувањето на офсет надвор од опсегот го полни стрингот со празни места. Нецелобројните типови се претвораат во цели броеви. Нелегалниот тип на офсет емитува
. Се користи само првиот карактер од доделениот стринг. Од PHP 7.1.0, доделувањето на празен стринг фрла фатална грешка. Претходно, доделуваше NULL бајт.
Забелешка: Од PHP 7.1.0, примена на операторот за празен индекс на празна низа фрла фатална грешка. Претходно, празната низа беше тивко претворена во низа.
Од PHP 7.1.0, применувањето на операторот за празен индекс на празен стринг фрла фатална грешка. Претходно, празниот стринг беше тивко претворен во низа.
<?php
// Get the first character of a string
$str = 'This is a test.';
$first = $str[0];
var_dump($first);
// Get the third character of a string
$third = $str[2];
var_dump($third);
// Get the last character of a string.
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
var_dump($last);
// Modify the last character of a string
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
var_dump($str);
?>Пример #20 Некои примери на стрингови
Офсетите на стрингови мора да бидат цели броеви или стрингови слични на цели броеви, инаку ќе се фрли предупредување.
<?php
$str = 'abc';
$keys = [ '1', '1.0', 'x', '1x' ];
foreach ($keys as $keyToTry) {
var_dump(isset($str[$keyToTry]));
try {
var_dump($str[$keyToTry]);
} catch (TypeError $e) {
echo $e->getMessage(), PHP_EOL;
}
echo PHP_EOL;
}
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
bool(true) string(1) "b" bool(false) Cannot access offset of type string on string bool(false) Cannot access offset of type string on string bool(false) Warning: Illegal string offset "1x" in Standard input code on line 10 string(1) "b"
Забелешка:
Пример #21 Пример за нелегални офсети на стринг
[]or{}Пристапување до променливи од други типови (не вклучувајќи низи или објекти што имплементираат соодветни интерфејси) користејќиnull.
Забелешка:
тивко враќа
[]or{}.
Забелешка:
Знаците во литералите на стринг може да се пристапат користејќи
{}Пристапување до знаци во литералите на стринг користејќи го
синтаксис е депрецирана во PHP 7.4. Ова е отстрането во PHP 8.0.
НизаКорисни функции и оператори not s може да се спојат користејќи операторот '.' (точка). Забележете дека операторот '+' (собирање) ќе работи за ова. Видете Користење на PHP од командната линија
Оператори на стринг string manipulation.
Постојат голем број корисни функции за Видете го секцијата за стринг функции за општите функции и Функции за регуларни изрази компатибилни со Perl
за напредна функционалност за пронаоѓање и замена. Постојат и функции за URL низи, и функции за шифрирање/дешифрирање низи (Натриум and Хеш).
Конечно, видете исто така функции за тип на карактер.
Конвертирање во низа
Вредност може да се конвертира во string користејќи го
(string) cast или strval() function.
Низа конверзијата автоматски се врши во опсегот на израз каде што е string потребно. Ова се случува кога се користи
echo or print функции, или кога променлива се споредува со string. Деловите за
Типови and
Префрлање на типови ќе го направат следново појасно. Видете исто така settype() function.
А bool true вредноста се конвертира во string
"1". bool false се конвертира во
"" (празна низа). Ова овозможува конверзија напред и назад помеѓу bool and string values.
Еден int or float се конвертира во
string што го претставува бројот текстуално (вклучувајќи го и делот со експонент за floats). Бројките со пловечки запирки можат да се претворат со користење на експоненцијална нотација (4.1E+6).
Забелешка:
Од PHP 8.0.0, знакот за децимална точка е секогаш точка ("."
."). Пред PHP 8.0.0, знакот за децимална точка е дефиниран во локалот на скриптата (категорија LC_NUMERIC). Погледнете го setlocale() function.
Низаs секогаш се претвораат во string
"Array"; поради ова, echo and
print сами по себе не можат да ја прикажат содржината на
array. За да видите единечен елемент, користете конструкција како
echo $arr['foo']. Погледнете подолу за совети за прикажување на целата содржина.
За да се претвори objects во string, магичниот метод __toString мора да се користи.
Ресурсs секогаш се претвораат во strings со структурата "Resource id #1", каде што 1
е бројот на ресурсот доделен на resource од PHP во време на извршување. Додека точната структура на овој стринг не треба да се потпира и е предмет на промена, тој секогаш ќе биде уникатен за даден ресурс во текот на животниот век на извршувањето на скриптата (т.е. веб-барано или CLI процес) и нема да се повтори. За да добиете resource's тип, користете го get_resource_type() function.
null секогаш се претвора во празен стринг.
Како што е наведено погоре, директно претворање на array, object, или resource Како што е наведено погоре, директното претворање на string во print_r() and var_dump() не дава никакви корисни информации за вредноста освен нејзиниот тип. Погледнете ги функциите
за поефективни начини за инспекција на содржината на овие типови. stringПовеќето PHP вредности исто така може да се претворат во serialize() function.
за трајно складирање. Овој метод се нарекува серијализација и се изведува од
На string Детали за типот на низата 0 во PHP е имплементиран како низа од бајти и цел број што го означува должината на баферот. Нема информации за тоа како тие бајти се преведуваат во знаци, оставајќи ја таа задача на програмерот. Нема ограничувања за вредностите од кои може да се состои низата; особено, бајти со вредност
(NUL бајти) се дозволени насекаде во низата (меѓутоа, некои функции, за кои во овој прирачник се вели дека не се „бинарно безбедни“, може да ги предадат низите на библиотеки што ги игнорираат податоците по NUL бајт).
Оваа природа на типот на низата објаснува зошто нема посебен тип „бајт“ во PHP – низите ја преземаат оваа улога. Функциите што не враќаат текстуални податоци – на пример, произволни податоци прочитани од мрежен приклучок – сепак ќе враќаат низи.
"á" Со оглед на тоа што PHP не диктира специфична кодировка за низите, можеби ќе се запрашате како се кодираат литералите на низите. На пример, дали низата "\xE1" е еквивалентна на
"\xC3\xA1" (ISO-8859-1),
"\x61\xCC\x81" (UTF-8, C форма),
(UTF-8, D форма) или некоја друга можна претстава? Одговорот е дека низата ќе биде кодирана на кој било начин на кој е кодирана во датотеката со скрипта. Така, ако скриптата е напишана во ISO-8859-1, низата ќе биде кодирана во ISO-8859-1 и така натаму. Сепак, ова не важи ако е овозможен Zend Multibyte; во тој случај, скриптата може да биде напишана во произволна кодировка (која е експлицитно декларирана или е откриена) и потоа да се претвори во одредена внатрешна кодировка, која потоа е кодировката што ќе се користи за литералите на низите. Имајте предвид дека постојат некои ограничувања за кодировката на скриптата (или за внатрешната кодировка, ако е овозможен Zend Multibyte) – ова речиси секогаш значи дека оваа кодировка треба да биде компатибилен надсет на ASCII, како што се UTF-8 или ISO-8859-1. Имајте предвид, сепак, дека кодировките зависни од состојбата каде истите вредности на бајтите може да се користат во почетни и не-почетни состојби на поместување може да бидат проблематични.
- Се разбира, за да бидат корисни, функциите што работат со текст можеби ќе треба да направат некои претпоставки за тоа како е кодирана низата. За жал, постои голема варијација по ова прашање низ функциите на PHP: substr(), strpos(), strlen() or strcmp()Некои функции претпоставуваат дека низата е кодирана во некоја (било која) еднобајтна кодировка, но тие не треба да ги толкуваат тие бајти како специфични знаци. Ова е случај, на пример, на
- . Друг начин да се размислува за овие функции е дека работат со бафер на меморија, т.е., тие работат со бајти и бајт офсети. htmlentities() Други функции им се поминува кодировката на низата, можно е тие исто така да претпоставуваат стандардна вредност ако не се дадени такви информации. Ова е случај на mbstring extension.
- Други го користат тековниот локал (види setlocale()), но работат бајт по бајт.
-
Конечно, тие можеби само претпоставуваат дека низата користи специфична кодировка, обично UTF-8. Ова е случајот со повеќето функции во
intl екстензијата и во
PCRE екстензијата (во последниот случај, само кога се користи модификаторот
u).
На крајот, ова значи дека пишувањето правилни програми што користат Unicode зависи од внимателно избегнување на функции што нема да работат и најверојатно ќе ги оштетат податоците и наместо тоа користење на функциите што се однесуваат правилно, генерално од intl and mbstring екстензиите. Сепак, користењето функции што можат да обработуваат Unicode кодирања е само почеток. Без разлика на функциите што ги обезбедува јазикот, од суштинско значење е да се знае спецификацијата на Unicode. На пример, програма што претпоставува дека постојат само големи и мали букви прави погрешна претпоставка.
Белешки од корисници за да означиме кој било валиден PHP израз.
<?php
/*
* PHP 8.5+: You can interpolate arbitrary expressions in double-quoted strings and heredoc,
* including method calls with arguments.
*/
class C
{
public function say(string $s): string
{
return $s;
}
public function run(): void
{
$w = 'WORLD';
$text = <<<TEXT
HELLO {$this->say($w)}
TEXT;
var_dump($text);
}
}
new C()->run();
// Output:
// string(11) "HELLO WORLD"In PHP 8.2 using ${var} in strings is deprecated, use {$var} instead:
<?php
$juice = "apple";
// Valid. Explicitly specify the end of the variable name by enclosing it in braces:
echo "He drank some juice made of {$juice}s.";
?>You can use the complex syntax to put the value of both object properties AND object methods inside a string. For example...
<?php
class Test {
public $one = 1;
public function two() {
return 2;
}
}
$test = new Test();
echo "foo {$test->one} bar {$test->two()}";
?>
Will output "foo 1 bar 2".
However, you cannot do this for all values in your namespace. Class constants and static properties/methods will not work because the complex syntax looks for the '$'.
<?php
class Test {
const ONE = 1;
}
echo "foo {Test::ONE} bar";
?>
This will output "foo {Test::one} bar". Constants and static properties require you to break up the string.easy transparent solution for using constants in the heredoc format:
DEFINE('TEST','TEST STRING');
$const = get_defined_constants();
echo <<<END
{$const['TEST']}
END;
Result:
TEST STRINGmd5('240610708') == md5('QNKCDZO')
This comparison is true because both md5() hashes start '0e' so PHP type juggling understands these strings to be scientific notation. By definition, zero raised to any power is zero.<?php
\\Example # 10 Simple Syntax - Solution for the last "echo" line.
class people {
public $john = "John Smith";
public $jane = "Jane Smith";
public $robert = "Robert Paulsen";
public $smith = "Smith";
}
$people = new people();
echo "$people->john then said hello to $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert greeted the two $people->smiths";
\\Won't work
\\Outputs: Robert Paulsen greeted the two
/**Solution:**\
echo "$people->robert greeted the two $people->smith\x08s";
\\Will work
\\Outputs: Robert Paulsen greeted the two Smiths
?>Here is a possible gotcha related to oddness involved with accessing strings by character past the end of the string:
$string = 'a';
var_dump($string[2]); // string(0) ""
var_dump($string[7]); // string(0) ""
$string[7] === ''; // TRUE
It appears that anything past the end of the string gives an empty string.. However, when E_NOTICE is on, the above examples will throw the message:
Notice: Uninitialized string offset: N in FILE on line LINE
This message cannot be specifically masked with @$string[7], as is possible when $string itself is unset.
isset($string[7]); // FALSE
$string[7] === NULL; // FALSE
Even though it seems like a not-NULL value of type string, it is still considered unset.Here is an easy hack to allow double-quoted strings and heredocs to contain arbitrary expressions in curly braces syntax, including constants and other function calls:
<?php
// Hack declaration
function _expr($v) { return $v; }
$_expr = '_expr';
// Our playground
define('qwe', 'asd');
define('zxc', 5);
$a=3;
$b=4;
function c($a, $b) { return $a+$b; }
// Usage
echo "pre {$_expr(1+2)} post\n"; // outputs 'pre 3 post'
echo "pre {$_expr(qwe)} post\n"; // outputs 'pre asd post'
echo "pre {$_expr(c($a, $b)+zxc*2)} post\n"; // outputs 'pre 17 post'
// General syntax is {$_expr(...)}
?>Leading zeroes in strings are (least-surprise) not treated as octal.
Consider:
$x = "0123" + 0;
$y = 0123 + 0;
echo "x is $x, y is $y"; //prints "x is 123, y is 83"
in other words:
* leading zeros in numeric literals in the source-code are interpreted as "octal", c.f. strtol().
* leading zeros in strings (eg user-submitted data), when cast (implicitly or explicitly) to integer are ignored, and considered as decimal, c.f. strtod().Simple function to create human-readably escaped double-quoted strings for use in source code or when debugging strings with newlines/tabs/etc.
<?php
function doubleQuote($str) {
$ret = '"';
for ($i = 0, $l = strlen($str); $i < $l; ++$i) {
$o = ord($str[$i]);
if ($o < 31 || $o > 126) {
switch ($o) {
case 9: $ret .= '\t'; break;
case 10: $ret .= '\n'; break;
case 11: $ret .= '\v'; break;
case 12: $ret .= '\f'; break;
case 13: $ret .= '\r'; break;
default: $ret .= '\x' . str_pad(dechex($o), 2, '0', STR_PAD_LEFT);
}
} else {
switch ($o) {
case 36: $ret .= '\$'; break;
case 34: $ret .= '\"'; break;
case 92: $ret .= '\\\\'; break;
default: $ret .= $str[$i];
}
}
}
return $ret . '"';
}
?>To save Your mind don't read previous comments about dates ;)
When both strings can be converted to the numerics (in ("$a" > "$b") test) then resulted numerics are used, else FULL strings are compared char-by-char:
<?php
var_dump('1.22' > '01.23'); // bool(false)
var_dump('1.22.00' > '01.23.00'); // bool(true)
var_dump('1-22-00' > '01-23-00'); // bool(true)
var_dump((float)'1.22.00' > (float)'01.23.00'); // bool(false)
?>