Portrety Uliczne Nieznajomych - zobacz wyjątkową galerię portretów z warszawskich ulic
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
Google Plus
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: 10
W CZYM MOGĘ POMÓC?


   
OPINIE UŻYTKOWNIKÓW
Prawdziwa skarbnica wiedzy na temat tworzenia stron WWW i nie tylko. Korzystam z porad praktycznie codziennie, jest mi to niezbędne w mojej pracy. Sam zajmuję się tworzeniem serwisów, ale porady pisane przez Darka sa dla mnie nieocenioną pomocą! Proste, czytelne i zrozumiałe dla każdego! Czekam na więcej!

Krzysztof Szypulski
KESS - projektowanie stron

   
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]

Wykorzystywanie typów danych

PHP nie wymaga (a nawet nie obsługuje) jawnej deklaracji typów zmiennych. Typ zmiennej jest określany na podstawie kontekstu, w jakim ta zmienna jest używana. Oznacza to m.in., że przy przypisaniu łańcucha znaków do zmiennej var, zmienna ta zmienia swój typ na string. Jeśli potem zostanie przypisana wartość całkowita, var zmienia swój typ na integer.

Przykładem automatyczniej konwersji typów jest operator dodawania '+'. Jeśli którykolwiek z operandów jest typu float, to wszystkie operandy zostaną potraktowane jako liczby float i taki też typ będzie zwrócony jako wynik dodawania. W przeciwnym razie operandy zostaną potraktowane jako liczby całkowite i wynikiem także będzie liczba całkowita. Proszę jednak zwrócić uwagę, że działanie to NIE zmienia typów samych operandów; zmienia jedynie sposób ich interpretacji przez operator dodawania.

$foo = "0";  // $foo jest łańcuchem znaków (ASCII 48)

$foo += 2;  // $foo jest liczbą całkowitą (2)
$foo = $foo + 1.3;  // $foo jest liczbą zmiennoprzecinkową (3.3)
$foo = 5 + "10 Małych świnek"; // $foo jest liczbą całkowitą (15)
$foo = 5 + "10 Większych świnek";    // $foo jest liczbą całkowitą (15)

Jeśli dwa ostanie przykłady wydają się tobie dziwne, zajrzyj do rozdziału Konwersja łańcuchów znaków.

Jeśli chcesz skonwertować zmienną z jednego typu do innego, użyj rzutowania typów. Aby zmienić typ zmiennej, użyj settype().

Jeśli chcesz przetestować którykolwiek z przykładów z tego rozdziału, możesz użyć funkcji var_dump().

Notatka: Efekty automatycznej konwersji do tablicy są aktualnie nieokreślone.

$a = 1;      // $a jest liczbą całkowitą
$a[0] = "f";  // $a staje się tablicą, $a[0] zawiera "f"

W powyższym przykładzie wydawać się może oczywiste, że $a stanie się tablicą z pierwszym elementem "f"; rozważ jednak poniższy przykład:

$a = "1";    // $a jest łańcuchem znaków
$a[0] = "f";  // Co z ofsetami łańcuchów? Co się dzieje?

Ponieważ PHP obsługuje indeksowanie łańcuchów za pomocą ofsetów, używając tej samej składni co indeksowanie tablic, powyższy przykład powoduje problem: czy $a powinno zostać tablicą z pierwszym elementem o wartości "f", czy raczej "f" powinno zostać pierwszym znakiem łańcucha $a?

Z tego właśnie powodu, od PHP 3.0.12 i PHP 4.0b3-RC4, efekt automatycznej konwersji pozostaje nieokreślony. Dyskusje odnośnie tego problemu trwają.

Rzutowanie typów

Rzutowanie typów w PHP działa mniej więcej tak jak w języku C: nazwa docelowego typu umieszczana jest w nawiasach przed nazwą zmiennej, która ma być zrzutowana.

$foo = 10;  // $foo jest liczbą całkowitą
$bar = (float) $foo;  // $bar jest typu float (zmiennoprzecinkowego)

Operatory rzutowania są następujące:

  • (int), (integer) - rzutowanie do liczb całkowitych

  • (bool), (boolean) - rzutowanie do typu boolowskiego

  • (float), (double), (real) - rzutowanie do liczb zmiennoprzecinkowych

  • (string) - rzutowanie do łańcucha znaków

  • (array) - rzutowanie do tablicy

  • (object) - rzutowanie do obiektu

Notatka: Zamiast rzutować zmienną do łańcucha znaków operatorem, można też umieścić zmienną w cudzysłowie podwójnym.

Wewnątrz nawiasów operatora rzutowania mogą znajdować się tabulacje i spacje, więc poniższe przykłady są funkcjonalnie identyczne:

$foo = (int) $bar;
$foo = ( int ) $bar;

Efekt rzutowania pomiędzy niektórymi typami nie zawsze daje spodziewany wynik. Więcej informacji o skutkach rzutowania w rozdziałach:

Przy rzutowaniu lub wymuszeniu konwersji z tablicy do łańcucha znaków, rezultatem będzie słowo Array. Przy rzutowaniu lub wymuszeniu konwersji z obiektu do łańcucha znaków, rezultatem będzie słowo Object.

Przy rzutowaniu ze zmiennej skalarnej lub łańcucha do tablicy, wartość zmiennej stanie się pierwszym elementem tablicy:

$var = 'ciao';
$arr = (array) $var;
echo $arr[0];  // wynik: 'ciao'

Przy rzutowaniu ze zmiennej skalarnej lub łańcucha do obiektu, wartość zmiennej stanie się właściwością obiektu; właściwość ta będzie nazywać się 'scalar':

$var = 'ciao';
$obj = (object) $var;
echo $obj->scalar;  // wynik: 'ciao'




User Contributed Notes

23-Jun-2005 02:47

If you have a boolean, performing increments on it won't do anything despite it being 1.  This is a case where you have to use a cast.

<html>
<body> <!-- don't want w3.org to get mad... -->
<?php
$bar
= TRUE;
?>
I have <?=$bar?> bar.
<?php
$bar
++;
?>
I now have <?=$bar?> bar.
<?php
$bar
= (int) $bar;
$bar++;
?>
I finally have <?=$bar?> bar.
</body>
</html>

That will print

I have 1 bar.
I now have 1 bar.
I finally have 2 bar.


25-May-2005 07:35

It appears in PHP 5.0.0, that casting will convert the variable to the specified type, not return a copy of the variable converted to that type.

ie:

$str = "foo";
$int = (int) $str;
echo "str: $str, int: $int";
// prints out "0, 0" instead of "foo, 0".

How it works with classes, I don't know.


toma at smartsemantics dot com
10-Mar-2005 03:24

In my much of my coding I have found it necessary to type-cast between objects of different class types.

More specifically, I often want to take information from a database, convert it into the class it was before it was inserted, then have the ability to call its class functions as well.

The following code is much shorter than some of the previous examples and seems to suit my purposes.  It also makes use of some regular expression matching rather than string position, replacing, etc.  It takes an object ($obj) of any type and casts it to an new type ($class_type).  Note that the new class type must exist:

function ClassTypeCast(&$obj,$class_type){
   if(class_exists($class_type,true)){
       $obj = unserialize(preg_replace"/^O:[0-9]+:\"[^\"]+\":/i",
         "O:".strlen($class_type).":\"".$class_type."\":", serialize($obj)));
   }
}


Raja
10-Feb-2005 12:05

Uneven division of an integer variable by another integer variable will result in a float by automatic conversion -- you do not have to cast the variables to floats in order to avoid integer truncation (as you would in C, for example):

$dividend = 2;
$divisor = 3;
$quotient = $dividend/$divisor;
print $quotient; // 0.66666666666667


memandeemail at gmail dot com
09-Dec-2004 02:29

/**
   * @return bool
   * @param array[byreference] $values
   * @desc Convert an array or any value to Escalar Object [not tested in large scale]
   */
   function setobject(&$values) {
       $values = (object) $values;
       foreach ($values as $tkey => $val) {
           if (is_array($val)) {
               setobject($val);
               $values->$tkey = $val;
           }
       }
       return (bool) $values;
   }


tom5025_ at hotmail dot com
24-Aug-2004 10:27

function strhex($string)
{
   $hex="";
   for ($i=0;$i<strlen($string);$i++)
       $hex.=dechex(ord($string[$i]));
   return $hex;
}
function hexstr($hex)
{
   $string="";
   for ($i=0;$i<strlen($hex)-1;$i+=2)
       $string.=chr(hexdec($hex[$i].$hex[$i+1]));
   return $string;
}

to convert hex to str and vice versa


dimo dot vanchev at bianor dot com
10-Mar-2004 04:02

For some reason the code-fix posted by philip_snyder at hotmail dot com [27-Feb-2004 02:08]
didn't work for me neither with long_class_names nor with short_class_names. I'm using PHP v4.3.5 for Linux.
Anyway here's what I wrote to solve the long_named_classes problem:

<?php
function typecast($old_object, $new_classname) {
   if(
class_exists($new_classname)) {
      
$old_serialized_object = serialize($old_object);
      
$old_object_name_length = strlen(get_class($old_object));
      
$subtring_offset = $old_object_name_length + strlen($old_object_name_length) + 6;
      
$new_serialized_object  = 'O:' . strlen($new_classname) . ':"' . $new_classname . '":';
      
$new_serialized_object .= substr($old_serialized_object, $subtring_offset);
       return
unserialize($new_serialized_object);
     } else {
         return
false;
     }
}
?>


philip_snyder at hotmail dot com
27-Feb-2004 04:08

Re: the typecasting between classes post below... fantastic, but slightly flawed. Any class name longer than 9 characters becomes a problem... SO here's a simple fix:

function typecast($old_object, $new_classname) {
  if(class_exists($new_classname)) {
   // Example serialized object segment
   // O:5:"field":9:{s:5:...  <--- Class: Field
   $old_serialized_prefix  = "O:".strlen(get_class($old_object));
   $old_serialized_prefix .= ":\"".get_class($old_object)."\":";

   $old_serialized_object = serialize($old_object);
   $new_serialized_object = 'O:'.strlen($new_classname).':"'.$new_classname . '":';
   $new_serialized_object .= substr($old_serialized_object,strlen($old_serialized_prefix));
   return unserialize($new_serialized_object);
  }
  else
   return false;
}

Thanks for the previous code. Set me in the right direction to solving my typecasting problem. ;)


post_at_henribeige_dot_de
03-May-2003 06:37

If you want to do not only typecasting between basic data types but between classes, try this function. It converts any class into another. All variables that equal name in both classes will be copied.

function typecast($old_object, $new_classname) {
  if(class_exists($new_classname)) {
   $old_serialized_object = serialize($old_object);
   $new_serialized_object = 'O:' . strlen($new_classname) . ':"' . $new_classname . '":' .
                             substr($old_serialized_object, $old_serialized_object[2] + 7);
   return unserialize($new_serialized_object);
  }
  else
   return false;
}

Example:

class A {
  var $secret;
  function A($secret) {$this->secret = $secret;}
  function output() {echo("Secret class A: " . $this->secret);}
}

class B extends A {
  var $secret;
  function output() {echo("Secret class B: " . strrev($this->secret));}
}

$a = new A("Paranoia");
$b = typecast($a, "B");

$a->output();
$b->output();
echo("Classname \$a: " . get_class($a) . "Classname \$b: " . get_class($b));

Output of the example code above:

Secret class A: Paranoia
Secret class B: aionaraP
Classname $a: a
Classname $b: b


yury at krasu dot ru
27-Nov-2002 10:24

incremental operator ("++") doesn't make type conversion from boolean to int, and if an variable is boolean and equals TRUE than after ++ operation it remains as TRUE, so:

$a = TRUE;
echo ($a++).$a;  // prints "11"


29-Aug-2002 07:26

Printing or echoing a FALSE boolean value or a NULL value results in an empty string:
(string)TRUE //returns "1"
(string)FALSE //returns ""
echo TRUE; //prints "1"
echo FALSE; //prints nothing!


amittai at NOSPAMamittai dot com
21-Aug-2002 08:30

Uneven division of an integer variable by another integer variable will result in a float by automatic conversion -- you do not have to cast the variables to floats in order to avoid integer truncation (as you would in C, for example):

$dividend = 2;
$divisor = 3;
$quotient = $dividend/$divisor;
print $quotient; // 0.66666666666667

Amittai Aviram


 

 
  © 1996-2012 & Reporter.plmiejscao serwisieabonamentwarunki korzystaniaRSSkontakt