ZALOGUJ SIĘ
login:
hasło:
przypomnij hasło
załóż konto użytkownika
(i zobacz kilka porad gratis)
   
WYSZUKIWARKA I DZIAŁY
całe porady  tytuły
zaznacz działy do przeszukania
(brak wyboru = wszystkie działy)
PHP
MySQL >
PostgreSQL
SQLite
Perl
Java
XML
XSLT
XPath
WML
SVG
RegExp
Wyszukiwarki
Ochrona
VBScript
XHTML/CSS
JavaScript
Grafika
Flash
Photoshop
Windows
Linux
Bash
Apache
Procmail
E-biznes
Explorer
Opera
Firefox
Inne porady
   
KURSY, DOKUMENTACJE
Własne:
XHTML/CSS
JavaScript
ActionScript
WML, RSS, SSI
Pozostałe:
PHP
MySQL
Java API
więcej...
   
użytkowników online: 200
W CZYM MOGĘ POMÓC?


   
USŁUGI
Tworzenie/prowadzenie stron
Pisanie/modyfikacje skryptów
Systemy CMS, bazy danych
Szkolenia, doradztwo, audyty
Fotograf Warszawa
   
OPINIE UŻYTKOWNIKÓW
Porady zamieszczone tutaj przez Darka są pomocne w wielu chwilach. Wielokrotnie tworząc jakiś złożony serwis korzystam z tych porad. Można by tworzyć samemu te skrypty, ale tak naprawdę czy nie lepiej jest wziąć skrypt z tej strony i zmodyfikowac go dla swoich potrzeb? Wprawdzie możemy taki skrypt napisać sami, ale po co, skoro stracimy czas na coś, co ktoś juz napisał, przetestował i może zagwarantować, że działa poprawnie. Któryś raz z rzędu opłacam abonament i nie raz jeszcze opłacę. Kawał dobrej roboty i ogrom wiedzy w jednym miejscu.

Piotr Karamański
Design Studio

   
GALERIA FOTOGRAFII
   
PODRĘCZNIK PHP 5.x, 4.x, 3.x - częściowo spolszczony / źródło: www.php.net

[Spis] [A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] [L] [M] [N] [O] [P] [Q] [R] [S] [T] [U] [V] [X] [W] [Z]

Łańcuchy znaków (string)

Typ string oznacza łańcuch znaków. W PHP znak jest tym sam co bajt, co oznacza, że jest możliwych 256 różnych znaków. Oznacza to także, że PHP nie posiada żadnej wbudowanej obsługi Unikodu.

Notatka: Nie ma technicznych problemów, które utrudniałyby tworzenie bardzo długich ciągów znaków. Nie ma też ustalonej maksymalnej długości łańcuchów znaków obsługiwanych w PHP, więc nie ma powodu do obaw, że dany łańcuch jest zbyt długi.

Składnia

Łańcuch znaków można utworzyć na trzy sposoby.

Pojedyncze cudzysłowy

Najprostszym sposóbem na zdefiniowanie prostego łańcucha znaków, jest umieszczenie go w pojedynczych cudzysłowach (znak ').

Aby w takim łańcuch umieścić symbol pojedynczego cudzysłowu, należy go poprzedzić ukośnikiem wstecznym (\), tak jak w wielu innych językach programowania. Jeśli ukośnik wsteczny ma wystąpić przed symbolem pojedynczego cudzysłowu lub na końcu łańcucha, wtedy należy napisać go dwukrotnie. W przypadku użycia ukośnika wstecznego z innym znakiem, ukośnik też zostanie wyświetlony! Nie ma zatem potrzeby pisania ukośnika dwukrotnie w innych sytuacjach.

Notatka: W PHP 3, ostrzeżenie na poziomie E_NOTICE zostanie wyświetlone, jeśli zajdzie powyższa sytuacja.

Notatka: W przeciwieństwie do dwóch pozostałych składni, zmienne nie będą zamienione na swoje wartości, kiedy pojawią się pomiędzy pojedynczymi cudzysłowami.

echo 'przykładowy tekst';
echo 'Wewnątrz łańcuchów znaków mogą się znajdować przełamania linii,
o właśnie takie.';
echo 'Adam powiedział: "I\'ll be back"';
// wynik: ... "I'll be back"
echo 'Czy na pewno chcesz skasować C:\\*.*?';
// wynik: ... skasować C:\*.*?
echo 'Czy na pewno chcesz skasować C:\*.*?';
// wynik: ... skasować C:\*.*?
echo 'Próbuję w tym miejscu wprowadzić: \n znak nowej linii';
// wynik: ... wprowadzić: \n znak nowej linii

Podwójne cudzysłowy

Kiedy łańcuch znaków jest umieszczony pomiędzy podwójnymi cudzysłowami, PHP interpretuje więcej sekwencji cytowania dla znaków specjalnych:

Tabela 11-1. Znaki cytowane (specjalne)

sekwencjaznaczenie
\nnowa linia (LF lub 0x0A (10) w ASCII)
\rpowrót karetki (CR lub 0x0D (13) w ASCII)
\ttabulacja pozioma (HT lub 0x09 (9) w ASCII)
\\odwrotny ukośnik
\$znak dolara
\"cudzysłów podwójny
\[0-7]{1,3} sekwencja znaków pasująca do powyższego wyrażenia regularnego daje znak zapisany w notacji ósemkowej
\x[0-9A-Fa-f]{1,2} sekwencja znaków pasująca do powyższego wyrażenia regularnego daje znak zapisany w notacji szesnastkowej

Tak jak w poprzedniej składni, zapisanie ukośnika wstecznego przed każdym innymi znakiem spowoduje wyświetlenie zarówno ukośnika, jak i znaku.

Ale najważniejszą właściwością podwójnych cudzysłowów jest to, że zapisane w nich zmienne zostaną zamienione na ich wartości. Więcej informacji w rozdziale parsowanie łańcuchów znaków.

Składnia Heredoc

Jeszcze jednym sposobem na zapisanie łańcucha znaków jest użycie skladni heredoc ("<<<"). Po operatorze <<< powinno się umieścić identyfikator i takim samym identyfikatorem trzeba zakończyć łańcuch znaków.

Identyfikator zamykający musi zaczynać się w pierwszej kolumnie nowej linii. Identyfikator musi też podlegać regułom nazewnictwa w PHP: musi się składać wyłącznie z alfanumerycznych znaków oraz znaku podkreślenia i musi zaczynać się od litery lub znaku podkreślenia.

Ostrzeżenie

Ważne by pamiętać, że linia zawierająca identyfikator zamykający nie może zawierać żadnych innych znaków, z wyjątkiem średnika (;). Znaczy to przede wszystkim, że identyfikator zamykający nie może być wcinany, i nie może być żadnych spacji ani tabulacji przed lub za średnikiem.

Najbardziej dokuczliwym ograniczeniem jest to, że wewnątrz tego łańcucha znaków nie może być znaku powrotu karetki (\r) na końcu linii, jedynie znak nowej linii (\n). Ponieważ Microsoft Windows używa jako znaku końca linii sekwencji \r\n, łańcuchy znaków zapisne w składni heredoc mogą nie działać, jeśli skrypt zostanie napisany w edytorze windowsowym. Na szczęście większość edytorów tekstowych udostępnia możliwość zapisania pliku w uniksowym formacie końca linii.

Składnia heredoc zachowuje się podobnie jak tekst w cudzysłowach podwójnych. Oznacza to też, ze nie ma potrzeby cytowania cudzysłowów w tej składni, ale nadal można używać znaków cytowanych, opisanych powyżej. W tej składni nazwa zmiennej zamieniana jest na jej wartość, ale należy zachować ostrożność przy zapisie złożonych zmiennych razem z tekstem.

Przykład 11-2. Przykład składni heredoc

<?php
$str
= <<<EOD
Przykład łańcucha znaków,
zajmującego kilka linii,
zapisanego w składni heredoc.

Przykładowe zastosowanie w przezentacji liryki.

Litwo! Ojczyzno moja! ty jesteś jak zdrowie;
Ile cię trzeba cenić, ten tylko się dowie,
Kto cię stracił. Dziś piękność twą w całej ozdobie
Widzę i opisuję, bo tęsknię po tobie.
\tAdam Mickiewicz - Pan Tadeusz
EOD;

/* Bardziej złożony przykład, ze zmiennymi */
class foo
{
   var
$foo;
   var
$bar;

   function
foo()
   {
      
$this->foo = 'Foo';
      
$this->bar = array('Bar1', 'Bar2', 'Bar3');
   }
}

$foo = new foo();
$name = 'MojeImię';

echo <<<EOT
Nazywam się "$name". Wyświetlam $foo->foo.
A teraz wyświetlam z tablicy:
{$foo->bar[1]}.
Po dwukropku powinien pojawić się znak 'A':
\x41
EOT;
?>

Notatka: Obsługa składni heredoc została dodana w PHP 4.

Parsowanie zmiennych

Kiedy łańcuch znaków jest zapisany w cudzysłowach podwójnych lub w składni heredoc, zawarte w nim nazwy zmiennych są parsowane, tzn. zamieniane na ich wartości.

Są dwa rodzaje składni, prosta i złożona. Składnia prosta jest najbardziej popularna i najwygodniejsza, pozwala na parsowanie zmiennej, wartości z tablicy oraz właściwości obiektu.

Składnia złożona pojawiła się w PHP 4, i można ją rozpoznać po nawiasach klamrowych, otaczających wyrażenie.

Składnia prosta

Jeśli wewnątrz zmiennej pojawi się znak dolara ($), parser pobierze tyle znaków, ile tylko się da, aby utworzyć poprawną nazwę zmiennej. Aby jawnie określić koniec nazwy zmiennej, należy ją zapisać w klamrach.

$beer = 'Heineken';
echo "$beer's taste is great"; /* działa, "'" nie jest poprawnym znakiem nazwy
zmiennej*/
echo "He drunk some $beers"; /* nie działa, 's' jest poprawnym znakiem nazwy
zmiennej*/
echo "He drunk some ${beer}s"; // działa

Podobnie działa parsowanie elementu tablicy lub właściwości obiektu. Dla tablic, prawy nawias prostokątny (]) oznacza koniec indeksu. Dla właściwości obiektu obowiązują te same reguły jak dla zwykłych zmiennych, jednak nie działają tu opisane powyżej sztuczki ze zmiennymi.

$owoce = array( 'truskawka' => 'czerwona' , 'banan' => 'żółty' );

// zauważ że to działa inaczej poza cudzysłowami
echo "Banan jest $owoce[banan].";

echo "Kwadrat ma szerokość $kwadrat->szerokość metrów.";

// Nie działa. Trzeba tu zastosować składnię złożoną
echo "Kwadrat ma szerokość $kwadrat->szerokość00 centymetrów.";

Do wyrażeń bardziej skomplikowanych należy używać składni złożonej.

Składnia złożona

Nazwa tej składni nie pochodzi od skomplikowanego zapisu, tylko od możliwości obsługi bardziej złożonych wyrażeń.

Za pomocą tej składni można umieszczać w łańcuchach znaków każdą wartość istniejącą w przestrzeni nazw. Odpowiednie wyrażenie pisze się tak, jakby miało ono znajdować się gdziekolwiek poza łańcuchem znaków, a potem tylko umieszcza się je między { i }. Ponieważ nie można cytować "{", składnia ta będzie prawidłowo rozpoznana tylko wtedy, kiedy $ znajduje się bezpośrednio za {. (Użyj "{\$" lub "\{$" aby uzyskać "{$"). Poniżej kilka przykładów:

$fajne = 'fantastyczne';
echo "To jest { $fajne}"; // nie działa, zwraca: To jest { fantastyczne}
echo "To jest {$fajne}";  // działa, zwraca: To jest fantastyczne
echo "Kwadrat ma szerokość {$kwadrat->szerokość}00 centimetrów.";
echo "To działa: {$arr[4][3]}";   

// Tak jest źle z tego samego powodu
// co $foo[bar] poza łańcuchem.
echo "Tak jest źle: {$arr[foo][3]}";

echo "Prawidłowo jest tak: {$arr['foo'][3]}";
echo "Można nawet pisać tak: {$obj->wartości[3]->nazwa}";
echo "To jest wartość zmiennej o nazwie $nazwa: {${$nazwa}}";

Indeksowanie łańcucha (ofsety)

Dostęp do pojedynczego znaku łańcucha jest możliwy po podaniu jego indeksu (ofsetu) w nawiasach klamrowych, zaraz po nazwie zmiennej. Pierwszy znak w łańcuchu ma indeks zero.

Notatka: Dla zachowania kompatybilności wstecznej, nadal można używać nawiasów kwadratowych, jednak składnia ta w PHP 4 uznana jest za przestarzałą.

Przykład 11-3. Przykłady używania łańcuchów znaków

<?php
/* Przypisywanie łańcucha do zmiennej */
$str = "To jest łańcuch znaków";

/* Dołączanie innego łańcucha */
$str = $str . " a to jego dalsza część";

/* inny sposób dołączania, ze znakiem nowej linii na końcu */
$str .= " wraz ze znakiem nowej linii na końcu.\n";

/* Ten łańcuch będzie zawierać: "<p>Liczba: 9</p>" */
$num = 9;
$str = "<p>Liczba: $num</p>";

/* Natomiast tutaj będzie: "<p>Liczba: $num</p>" */
$num = 9;
$str = '<p>Liczba: $num</p>';

/* Pobranie pierwszego znaku łańcucha  */
$str = 'To jest przykład.';
$pierwszy = $str{0};

/* Ostatni znak łańcucha */
$str = 'Dalsza część przykładu.';
$ostatni = $str{strlen($str)-1};
?>

Przydatne funkcje i operatory

Łańcuchy znaków łączy się za pomocą operatora '.' (kropka). Proszę pamiętać, że operator dodawania '+' nie wykonuje operacji łączenia łańcuchów. Więcej informacji w rozdziale operatory łańcuchowe.

PHP posiada mnóstwo funkcji operujących na łańcuchach znaków.

Najwięcej na ten temat w rozdziale funkcje łańcuchowe. Poza tym obsługiwane są wyrażenia regularne dla potrzeb zaawnsowanych operacji znajdź i zamień (w dwóch odmianach: Perl oraz POSIX extended).

Są także funkcje obsługi łańcuchów URL, jak również funkcje szyfrowania i deszyfrowania łańcuchów (mcrypt oraz mhash).

Jeśli nadal nie znalazłeś tego, czego potrzebujesz, być może pomogą ci funkcje kontroli typu znaków.

Konwersja łańcuchów znaków

Jeśli łańcuch znaków jest konwertowany na postać liczbową, rezultat konwersji będzie zależał od poniższych czynników.

Łańcuch zostanie skonwertowany do typu float, jeśli zawiera znaki ".", "e" lub "E". W przeciwnym razie zostanie skonwertowany do typu integer.

Wartość liczbowa łańcucha znaków zależy od pierwszych znaków tego łańcucha. Jeśli łańcuch zaczyna się od poprawnej wartości liczbowej, wartość ta będzie używa przy konwersji. W przeciwnym razie zwrócona będzie wartość 0 (zero). Poprawna wartość liczbowa zaczyna się od opcjonalnego znaku, po którym znajduje się jedna, lub kilka cyfr (opcjonalnie zawierające przecinek dziesiętny), po którym opcjonalnie znajduje się eksponent. Eksponent jest to znak "e" lub "E", po którym następuje jedna, lub więcej cyfr.

Kiedy pierwszym wyrażeniem jest łańcuch znaków, typ zmiennej będzie zależał od drugiego wyrażenia.

$foo = 1 + "10.5";              // $foo jest typu float (11.5)
$foo = 1 + "-1.3e3";            // $foo jest typu float (-1299)
$foo = 1 + "bob-1.3e3";        // $foo jest typu integer (1)
$foo = 1 + "bob3";              // $foo jest typu integer (1)
$foo = 1 + "10 małych świnek";    // $foo jest typu integer (11)
$foo = 1 + "10 malutkich świnek"; // $foo jest typu integer (11)
$foo = "10.0 świnek " + 1;        // $foo jest typu float (11)
$foo = "10.0 świnek " + 1.0;      // $foo jest typu float (11)

Więcej informacji na temat tej konwersji znajduje się w podręczniku Uniksa, na stronie polecenia strtod(3).

Jeśli chciałbyś przetestować któryś z przykładów w tym rozdziale, możesz je skopiować i wkleić, a następnie dodać poniższą linię i obserwować rezultaty.

echo "\$foo==$foo; jest typu " . gettype ($foo) . "<br>\n";




User Contributed Notes

adam at obledesign dot com
21-Jan-2006 09:51

If you really want to get constants inside your string you can do something like this (PHP5 only).

<?php

class GetConstant {
 
public function __get($constant_name) {
  return (
defined($constant_name) ? constant($constant_name) : NULL);
 }
}

$C = new GetConstant();

define('FOO','bar');

echo(
"I want a candy {$C->FOO}.");

?>


csaba at alum dot mit dot edu
31-Dec-2005 12:15

Multiline strings:
In most of the strings on this doc page, the heredoc form (<<<) is not needed.  The heredoc form is useful when you also want to embed, without escaping, quotes of the same type as the starting quote.  The single quote form is particularly useful when you want to specify multiline code for future evaluation.

<?php
$code
= '
  $output = "Mutliline output";
  $out = "$output within multiline code:
$ needs escaping within \$out,
and double quotes (\") need escaping within \$out,
but single quotes (\') need escaping everywhere.";
  // Next two lines work with php.exe
  /* on Windows systems */
  $oWSH = new COM("WScript.Shell");
  $oWSH->Popup($out, 4, \'IO Demo\', 131120);
'
;
print
"<pre>$code</pre>";
call_user_func (create_function('', $code));
?>

Happy New Year,
Csaba Gabor from Vienna


19-Dec-2005 03:10

RE  www.feisar.de
<?php

$x1
= '111111111111111111';
$x2 = '111111111111111112';

echo (
$x1 == $x2) ? "true\n" : "false\n";

?> // prints true;

You are right about need to use === to force a string to string comparison.

However as the number exceed the 32 bit range PHP is comparing the floating point not the integer values. 

Both have a float values of 1.11111111111E+017


wilkinson98 at hotmail dot com
17-Dec-2005 02:53

You can't depend on hex in strings to be converted.

<?php

// prints 17
echo 1 + '0x10';   

// prints 0
echo (int) '0x10';
                    
?>


Alex
09-Dec-2005 08:24

For heredocs, the manual is accurate.  Many other descriptions on the web are not.

PHP always tries to evaluate variables.  So if you want a $ sign, it always needs to be escaped or in complex format, depending on the context.  This is especially important if you are trying to do an eval().

<?php
   $foo
= 1;
  
$code = <<<CODE
$bar = $foo;
CODE;
   eval (
$code);    // doesn't work
?>

<?php
   $foo
= 1;
  
$code = <<<CODE
\$
bar = \$foo;
CODE;
   eval (
$code);    // $bar = $foo;
?>

<?php
   $foo
= 1;
  
$code = <<<CODE
\$
bar = {$foo};
CODE;
   eval (
$code);    // $bar = 1;
?>

<?php
   $foo
= 1;
  
$code = <<<CODE
{
$bar} = {$foo};
CODE;
   eval (
$code);    // doesn't work
?>


webmaster at rephunter dot net
30-Nov-2005 05:57

Use caution when you need white space at the end of a heredoc. Not only is the mandatory final newline before the terminating symbol stripped, but an immediately preceding newline or space character is also stripped.

For example, in the following, the final space character (indicated by \s -- that is, the "\s" is not literally in the text, but is only used to indicate the space character) is stripped:

$string = <<<EOT
this is a string with a terminating space\s
EOT;

In the following, there will only be a single newline at the end of the string, even though two are shown in the text:

$string = <<<EOT
this is a string that must be
followed by a single newline

EOT;


DELETETHIS dot php at dfackrell dot mailshell dot com
01-Nov-2005 05:05

Just some quick observations on variable interpolation:

Because PHP looks for {? to start a complex variable expression in a double-quoted string, you can call object methods, but not class methods or unbound functions.

This works:

<?php
class a {
   function
b() {
       return
"World";
   }
}
$c = new a;
echo
"Hello {$c->b()}.\n"
?>

While this does not:

<?php
function b() {
   return
"World";
}
echo
"Hello {b()}\n";
?>

Also, it appears that you can almost without limitation perform other processing within the argument list, but not outside it.  For example:

<?
$true
= true;
define("HW", "Hello World");
echo
"{$true && HW}";
?>

gives: Parse error: parse error, unexpected T_BOOLEAN_AND, expecting '}' in - on line 3

There may still be some way to kludge the syntax to allow constants and unbound function calls inside a double-quoted string, but it isn't readily apparent to me at the moment, and I'm not sure I'd prefer the workaround over breaking out of the string at this point.


php at simoneast dot NOSPAM dot net
12-Sep-2005 12:17

Be ULTRA careful when multiplying numbers like '1,000'.  If it's a string with a thousands separator like that, PHP ignores everything after the comma.

<?
echo "2,500" * 2;        // displays 4
echo "20,50" * 2;        // displays 4
echo "2,500.00" * 2;    // displays 4

is_numeric("2,500");    // false
?>

I was developing a shopping cart, and had items worth over $1,000 advertised as $1!  Luckily we realised before launch.


Don
29-Aug-2005 03:24

I found this very helpful:

http://shiflett.org/archive/140


diannes at dbfields dot com
21-Jun-2005 10:41

I was trying to perform a series of manipulations on a string  and found that there doesn't seem to be any easy way to force variable expansion to occur if a string hadn't originally been created as double-quoted or heredoc. Maybe there's an easier workaround than the one below, but it's what I ended up doing.
-------------------------------
$var = '5';
$str = "var = $var ";
echo $str;        // prints 'var = "5" ' (expected result)
$str = 'var = "$var" ';
echo $str;        // prints 'var = "$var" ' (expected result)

// NO VARIABLE EXPANSION:

$str = 'var = "$var" ';
echo $str;        // prints 'var = "$var" '
echo "$str";      // prints 'var = "$var" '
$str = "$str";
echo $str;        // still prints 'var = "$var" '
$str = (string)$str;
echo $str;        // still prints 'var = "$var" '
$str = strval($str);
echo $str;        // still prints 'var = "$var" '

// NO VARIABLE EXPANSION THIS WAY EITHER:

$str = 'var = "{$var}" ';
// yields similar results to above

// NO VARIABLE EXPANSION WHEN STRING IS FROM A FILE

$str = implode("",file("foo"));
echo $str;        // prints 'var = "$var" '

// THIS WILL FORCE VARIABLE EXPANSION TO OCCUR:

$str = str_replace('"','\"',$str);  // escape double quotes
echo eval('echo "'.$str.'";');      // prints 'var = "5" '
$str = 'ob_start(); echo "'.$str.'"; ob_get_contents();';
$str = eval($str);
echo $str;                          // prints 'var = "5" '


nutbar at innocent dot com
08-Jun-2005 06:10

A correction to skippy's comment:

"...you can use either ${ or {$ to open the curly expression ie. "${var}" and "{$var}" are equivalent."

Is incorrect.

For simple variables, such as in the example quoted yes both function and yeild the expected result.  However, when dealing with array variables like $array['key'], doing "${array['key']}" will yeild errors or unexpected results.  The correct formatting is "{$array['key']}".


shadda at gmail dot com
25-Jan-2005 01:39

It's fun to use heredoc syntax in conjunction with sprintf, and quite effective in my opinion.

sprintf(<<<EOS
The dog ran over the %s,
and landed on the %s
EOS
,'cat','floor');

Dunno if anyone else likes this method, but Its certainly usefull for constructing long verbose SQL statements.

Cheers.


lelon at lelon dot net
27-Oct-2004 09:01

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.


bishop
10-Sep-2004 12:47

Re: Jonathan Lozinski's note on vim syntax highlighting, we use EOHTML, EOSQL, and EOJAVASCRIPT quite frequently for HTML, SQL, and JavaScript, respectively.

eg:

<?php
$query
=<<<EOSQL
SELECT Foo.a,
       Foo.b,
       Bar.a
  FROM Foo
  LEFT
  JOIN Bar
     ON Foo.x=Bar.y
 WHERE Foo.b LIKE '%123%'
EOSQL;
?>

will be highlighted correctly for SQL under VIM.


Jonathan Lozinski
06-Aug-2004 09:03

A note on the heredoc stuff.

If you're editing with VI/VIM and possible other syntax highlighting editors, then using certain words is the way forward.  if you use <<<HTML for example, then the text will be hightlighted for HTML!!

I just found this out and used sed to alter all EOF to HTML.

JAVASCRIPT also works, and possibly others.  The only thing about <<<JAVASCRIPT is that you can't add the <script> tags..,  so use HTML instead, which will correctly highlight all JavaScript too..  There might be one for Text/css too?


skippy zuavra net
20-Jul-2004 05:55

The short version for the curly syntax:

1. $str{something} is the equivalent of $str[something]

2. Inside "" strings you can use any variable, no matter how complex the addressing mode (multiple index array, imbricated objects) by enclosing the variable in {}: "foo{$any_variable}bar".

To add to the confusion:

a) The two uses above have nothing in common, conceptually. For instance, #1 can use operations or functions as that something, #2 is restricted to just variables.

b) In #2, you can use either ${ or {$ to open the curly expression ie. "${var}" and "{$var}" are equivalent.


rtb27 at cam dot ac dot uk
30-Jun-2004 04:59

If you want side effects to occur during variable substituion inside strings, the "?" operator can help. For example:

<?php

$i
= 0;
echo <<<LONGSTRING

one
{${$i++ ? "i" : "i"}}
two
{${$i++ ? "i" : "i"}}
three
{${$i++ ? "i" : "i"}}

LONGSTRING;

?>

will print: "one 1 two 2 three 3"


www.feisar.de
28-Apr-2004 04:49

watch out when comparing strings that are numbers. this example:

<?php

$x1
= '111111111111111111';
$x2 = '111111111111111112';

echo (
$x1 == $x2) ? "true\n" : "false\n";

?>

will output "true", although the strings are different. With large integer-strings, it seems that PHP compares only the integer values, not the strings. Even strval() will not work here.

To be on the safe side, use:

$x1 === $x2


atnak at chejz dot com
12-Apr-2004 12:53

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.


zefram at cesena dot net
30-Mar-2004 02:04

Make attention to string conversion!
Strings may evaluate to true but also to zero!!

<?
 $hello
='hi there';
 echo(
$hello?'true':'false');        //true
 
echo($hello==0?'true':'false');      //true!!!!!
 
echo($hello===0?'true':'false');    //false
?>


maka3d at yahoo dot com dot br
26-Feb-2004 07:46

Remember that even PHP is type less, some convertions like INTEGER to STRING is not done when using character direct access like string functions does.
<?php
$str
= '456';
echo
strlen($str); // strlen convert int to string automatically
echo $str{0}; // this works
$str = 456;
echo
$str{0}; // this NOT works
$str = (string)$str; // do type cast to string
echo $str{1}; // now it works
?>


gijs at dghostingworld dot com
23-Feb-2004 08:18

If you use the heredoc syntax and you want to insert an function that echo's something use the following escape sequence: {${header('This is text', 'color')}}

This will execute the function.

hope this helps somebody.

G


marcus at synchromedia dot co dot uk
25-Jan-2004 12:41

If you need to output a string that contains the 'end of php' sequence ?>, or perhaps you have trouble with your editor's syntax colouring because of it, for instance if you wish to do this:

<?php
print "<?xml version=\"1.0\"?>\n";
?>

you can instead use an encoded char to remove the confusion:

<?php
print "<?xml version=\"1.0\"\x3F>\n";
?>

Note that this notes page doesn't have a problem with this syntax!


dandrake
20-Jan-2004 12:41

By the way, the example with the "\n" sequence will insert a new line in the html code, while the output will be decided by the HTML syntax. That's why, if you use

<?
 
echo "Hello \n World";
?>

the browser will receive the HTML code on 2 lines
but his output on the page will be shown on one line only.
To diplay on 2 lines simply use:

<?
 
echo "Hello <br>World";
?>

like in HTML.


mina86 at tlen dot pl
25-Dec-2003 08:00

Re: reuterpl at wp dot pl
No, that's not true.. I mean not exactly true gowever I know what you meant but begginers may not know and feal confused..

<?php
$str
= "Hello \n World";

echo(
$str);
// Output:
//  Hello
//    World
// Browser renders it as:
//  Hello World

echo('<pre>' . $str . '</pre>');
// Output:
//  <pre>Hello
//    World</pre>
// Browser renders it as:
//  Hello
//  World

$str = nl2br($str);
echo(
$str);
// Output:
//  Hello <br /> World
// Browser renders it as:
//  Hello
//  World

echo('<pre>' . $str . '</pre>');
// Output:
//  <pre>Hello <br /> World</pre>
// Browser renders it as:
//  Hello
//
//    World
?>

Re: cs_1 at gmx dot de
I use only UNIX line ends an have no problems with heredoc syntax, so maybe your problem was with something else..


dev6 at es11 dot com
28-Aug-2003 09:42

In response to the most recent post, by Edwin:  Huh? 

First, $foo is not NULL terminated, it's newline terminated.  NULL and \n are not even remotely the same thing. 

Second, the example you posted works perfectly.  Both values get computed and printed as 3.0, not 2.0.


edwin at se-technology dot com
06-Jun-2003 11:58

This one took me a while to sort out:

$foo = "1.5\n";
$bar = "1.5";
printf ("%6.2f, %6.2f ", $foo*2, $bar*2);

>> 2.0, 3.0

So apparently string conversion is messed up by NULL, an obvious solution in case you happen to have a NULL terminated string is:

$foo = rtrim ($foo);


gmarik at hotbox dot ru
24-Apr-2003 08:57

This is how I did it, if tou need to cut big text blocks in easy to browse text blocks:

$str = "bla bla nla. asdfasd. fdsfd fafsasf. asasdwe fdscz asdvc. afasffas. afafs vcxrqw cvea.";

preg_match_all("/.{1500,}?\./s",$str,$out,PREG_PATTERN_ORDER);
list($out) = $out;

print_r($out);

And this is the dynamic menu to navigate between the blocks:

for ($i=0; $i<count($out); $i++) {
$pgnum = $i+1;
echo "<option value=$pgnum>$pgnum</option>";
}


philip at cornado dot com
12-Apr-2003 02:37

Note that in PHP versions 4.3.0 and 4.3.1, the following provides a bogus E_NOTICE (this is a known bug):

echo "$somearray['bar']";

This is accessing an array inside a string using a quoted key and no {braces}.  Reading the documention shows all the correct ways to do this but the above will output nothing on most systems (most have E_NOTICE off) so users may be confused.  In PHP 4.3.2, the above will again yield a parse error.


03-Mar-2003 07:04

Regarding "String access by character":

Apparently if you edit a specific character in a string, causing the string to be non-continuous, blank spaces will be added in the empty spots.

echo '<pre>';
$str = '0123';
echo "$str\n";
$str{4} = '4';
echo "$str\n";
$str{6} = '6';
echo "$str\n";

This will output:
0123
01234
01234 6
Notice the blank space where 5 should be.

(PHP 4.3.1)


cs_1 at gmx dot de
11-Feb-2003 09:57

Be sure to save your PHP files with CrLf line ends when using the heredoc syntax for a variable, e.g.:

$var1 = <<<EOT
sdsdsd
EOT;

didn't work on my linux system when using unix line ends...


Jeff at jsgennusa at yahoo dot com
24-Jan-2003 08:28

This is why this is right:

$beer = 'Heineken';
echo "$beer's taste is great"; // works, "'" is an invalid character for varnames
echo "He drank some $beers";  // won't work, 's' is a valid character for varnames
echo "He drank some ${beer}s"; // works

In all these examples, the php code is looking for the variable $beer. 
In the first one, it works because when it finds $beer's it actually finds $beer and stops at the '. 
In the second one, it doesn't work because there is no variable designated as $beers.
The third one works because the php code reads { and } as specifying what the actually variable is that it should be looking for.  The { and } allow you to add onto the variable.


jm at roth dot lu
18-Jan-2003 04:09

ERRATA?

Shouldn't this :

echo "$beer's taste is great"; // works, "'" is an invalid character for varnames
echo "He drank some $beers";  // , 's' is a valid character for varnames
echo "He drank some ${beer}s"; // works

be like that:

echo "$beer's taste is great"; // won't work, "'" is an invalid character for varnames
echo "He drank some $beers";  // works, 's' is a valid character for varnames
echo "He drank some ${beer}s"; // works


vallo at cs dot helsinki dot fi
04-Nov-2002 02:41

Even if the correct way to handle variables is determined from the context, some things just doesn't work without doing some preparation.

I spent several hours figuring out why I couldn't index a character out of a string after doing some math with it just before. The reason was that PHP thought the string was an integer!

$reference = $base + $userid;
.. looping commands ..
$chartohandle = $reference{$last_char - $i};

Above doesn't work. Reason: last operation with $reference is to store a product of an addition -> integer variable. $reference .=""; (string catenation) had to be added before I got it to work:

$reference = $base + $userid;
$reference .= "";
.. looping commands ..
$chartohandle = $reference{$last_char - $i};

Et voil

 

 
  © 1996-2010 & Reporter.plmiejscao serwisieabonamentwarunki korzystaniaRSSkontakt