• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • settype()

    (PHP 4, PHP 5, PHP 7)

    设置变量的类型

    说明

    settype(mixed&$var,string $type): bool

    将变量$var的类型设置成$type

    参数

    $var

    要转换的变量。

    $type

    $type的可能值为:

    • “boolean”(或为“bool”,从 PHP 4.2.0 起)
    • “integer”(或为“int”,从 PHP 4.2.0 起)
    • “float”(只在 PHP 4.2.0 之后可以使用,对于旧版本中使用的“double”现已停用)
    • "string"
    • "array"
    • "object"
    • “null”(从 PHP 4.2.0 起)

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    范例

    Example #1settype()示例

    <?php
    $foo = "5bar"; // string
    $bar = true;   // boolean
    settype($foo, "integer"); // $foo 现在是 5   (integer)
    settype($bar, "string");  // $bar 现在是 "1" (string)
    ?>
    

    注释

    Note:

    Maximum value for "int"isPHP_INT_MAX.

    参见

    • gettype() 获取变量的类型
    • 类型转换
    • 类型戏法
    Note that you can't use this to convert a string 'true' or 'false' to a boolean variable true or false as a string 'false' is a boolean true. The empty string would be false instead...
    <?php
    $var = "true";
    settype($var, 'bool');
    var_dump($var); // true
    $var = "false";
    settype($var, 'bool');
    var_dump($var); // true as well!
    $var = "";
    settype($var, 'bool');
    var_dump($var); // false
    ?>
    
    Just a quick note, as this caught me out very briefly:
    settype() returns bool, not the typecasted variable - so:
    $blah = settype($blah, "int"); // is wrong, changes $blah to 0 or 1
    settype($blah, "int"); // is correct
    Hope this helps someone else who makes a mistake.. ;)
    Using settype is not the best way to convert a string into an integer, since it will strip the string wherever the first non-numeric character begins. The function intval($string) does the same thing.
    If you're looking for a security check, or to strip non-numeric characters (such as cleaning up phone numbers or ZIP codes), try this instead:
    <?
       $number=ereg_replace("[^0-9]","",$number);
    ?>
    
    you must note that this function will not set the type permanently! the next time you set the value of that variable php will change its type as well.
    To matt:
    This function accepts a paremeter, which does not imply you using hardcoded stuff, instead you can let the user choose! \o/
    As a part of a framework or something.
    Plus, you can probably call this with call_user_func
    Please note: 
    When using settype to convert indexed arrays to objects, the properties of the typed object will be integers:
    A brief example:
    $a = ['1', '2'];
    settype($a, 'object');
    var_dump($a);
    // output
    object(stdClass)#1 (2) {
     ["0"]=>
     string(1) "1"
     ["1"]=>
     string(1) "2"
    }
    $foo = "1";
    settype($foo, "bool");
    var_dump($foo); // Outputs: bool(true)
    $bar = "0";
    settype($bar, "bool");
    var_dump($bar); // Outputs: bool(false)
    any digit except 0 or -0 are considered true in boolean, and any string except '0' or '' are also considered true.
    <?php
    $foo = '0';
    settype($foo, 'boolean');
    var_dump($foo); // false
    $foo = 0;
    settype($foo, 'boolean');
    var_dump($foo); // false
    Instead of settype you could use:
    <?php
    $int=593; // $int is a integer
    $int.="";  // $int is now a string
    using (int) insted of the settype function works out much better for me. I have always used it. I personally don't see where settype would ever come in handy.
    This settype() behaviour seems consistent to me. Quoting two sections from the manual:
    "When casting from a scalar or a string variable to an array, the variable will become the first element of the array: "
    <pre>
    2 $var = 'ciao';
    3 $arr = (array) $var;
    4 echo $arr[0]; // outputs 'ciao' 
    </pre>
    And if (like your code above) you do a settype on an empty variable, you'll end up with a one element array with an empty (not unset!) first element. So appeanding to it will start appending at index 1. As for why reset() doesn't do anything:
    "When you assign a value to an array variable using empty brackets, the value will be added onto the end of the array."
    It doesn't matter where the array counter is; values are added at the end, not at the counter.
    In trying to convert an array of strings to an array of ints, 
    I attempted to use settype with array_walk.
    <?php
    //$numArray is generated by another process
    $numArray = array('13','14','33');
    var_dump($numArray);
    //my conversion function
    function str_to_int($val){
     //remember: settype($x, 'int') returns boolean (1=success, 0=failure)
     //--> so return $x to return new value
      settype($val,'int');
      echo "<br />gettype = ".gettype($val)."<br />";
      return $val;
    }
    array_walk($numArray,'str_to_int');
    var_dump($numArray);
    ?>
    The var_dumps both return the following:
    <?php
    array(3) { [0]=> string(2) "13" [1]=> string(2) "14" [2]=> string(2) "33" } 
    ?>
    The gettype echo will show the value as an integer.
    So it seems that settype($val,'int') makes the conversion, 
    but the function return value remains a string. 
    Since settype returns a boolean, using 
    <?php $val = settype($val, 'int'); ?> 
    is not a option.
    I resolved my array value conversion using this instead:
    <?php
    $numArray = 
       array_map(create_function('$value', 'return (int)$value;'),$numArray);
    ?>
    Thanks to the posting here:
    http://usrportage.de/archives/
    808-Convert-an-array-of-strings-into-an-array-of-integers.html
    Perhaps this will save someone else spinning wheels a bit. 
    Also thanks to robin at barafranca dot com for 
    pointing out the boolean return value of settype.
    /**
      * @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;
      }
    note that settype() will initialize an undefined variable. Therefore, if you want to preserve type and value, you should wrap the settype() call in a call to isset().
    <?php
    settype($foo, "integer");
    echo("|$foo|");
    ?>
    prints "|0|", NOT "||".
    To get the latter, use:
    <?php
    if(isset($foo)) settype($foo, "integer");
    echo("|$foo|");
    ?>
    
    settype() has some really strange, potentially buggy behavior.
    As noted by Michael Benedict, using settype() on a variable will initialize that variable. What is stranger is that using settype() on an uninitialized variable that you are treating as an array or object will also initialize the variable. So:
    <?php
    settype($foo->bar,"integer"); // stdClass Object ( [test] => 0 )
    ?>
    This works for a chain of any length: $foo->bar['baz']->etc
    Next we look at what happens if $foo is already set.
    <?php
    $foo = false;
    settype($foo->bar,"integer"); // stdClass Object ( [test] => 0 )
    ?>
    In and of itself, this wouldn't be problematic. It might even make sense. But in all other cases where $foo is defined, even if (boolean) $foo === false, it will throw an error unless $foo->bar is valid (i.e. $foo is an object already).
    <?php
    $foo = true;
    settype($foo->bar,"integer"); // Notice: Trying to get property of non-object
    ?>
    
    If you attempt to convert the special $this variable from an instance method (only in classes) :
    * PHP will silently return TRUE and leave $this unchanged if the type was 'bool', 'array', 'object' or 'NULL'
    * PHP will generate an E_NOTICE if the type was 'int', 'float' or 'double', and $this will not be casted
    * PHP will throw a catchable fatal error when the type is 'string' and the class does not define the __toString() method
    Unless the new variable type passed as the second argument is invalid, settype() will return TRUE. In all cases the object will remain unchanged.
    <?php
      // This was tested with PHP 7.2
      class Foo {
        function test() {
          printf("%-20s %-20s %s\n", 'Type', 'Succeed?', 'Converted');
          
          // settype() should throw a fatal error, as $this cannot be re-assigned
          printf("%-20s %-20s %s\n", 'bool', settype($this, 'bool'), print_r($this, TRUE));
          printf("%-20s %-20s %s\n", 'int', settype($this, 'int'), print_r($this, TRUE));
          printf("%-20s %-20s %s\n", 'float', settype($this, 'float'), print_r($this));
          printf("%-20s %-20s %s\n", 'array', settype($this, 'array'), print_r($this, TRUE));
          printf("%-20s %-20s %s\n", 'object', settype($this, 'object'), print_r($this, TRUE));
          printf("%-20s %-20s %s\n", 'unknowntype', settype($this, 'unknowntype'), print_r($this, TRUE));
          printf("%-20s %-20s %s\n", 'NULL', settype($this, 'NULL'), print_r($this, TRUE));
          printf("%-20s %-20s %s\n", 'string', settype($this, 'string'), print_r($this, TRUE));
        }
      }
      $a = new Foo();
      $a->test();
    ?>
    Here is the result :
    Type         Succeed?       Converted
    bool         1          Foo Object
    (
    )
    Notice: Object of class Foo could not be converted to int in C:\php\examples\oop-settype-this.php on line 9
    int         1          Foo Object
    (
    )
    Notice: Object of class Foo could not be converted to float in C:\php\examples\oop-settype-this.php on line 10
    float        1          Foo Object
    (
    )
    array        1          Foo Object
    (
    )
    object        1          Foo Object
    (
    )
    Warning: settype(): Invalid type in C:\php\examples\oop-settype-this.php on line 14
    unknowntype                Foo Object
    (
    )
    NULL         1          Foo Object
    (
    )
    Catchable fatal error: Object of class Foo could not be converted to string in C:\php\examples\oop-settype-this.php on line 15
    If the class Foo implements __toString() :
    <?php
      class Foo {
        // ...
        function __toString() {
          return 'Foo object is awesome!';
        }
        // ...
      }
    ?>
    So the first code snippet will not generate an E_RECOVERABLE_ERROR, but instead print the same string as for the other types, and not look at the one returned by the __toString() method.
    Hope this helps ! :)

    上篇:serialize()

    下篇:strval()