|
użytkowników online: 10
|
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
|
|
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]
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.
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.
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:
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 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.
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:
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:
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':
User Contributed Notes23-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
|