On Nov 19, 2007 12:13 AM, David Coallier wrote:
I was thinking at something along the lines of objects also for instance:
$i = new Integer(33);
function foo(Integer $var) {
}
foo ($i); else it emits a fatal error. But also if you do
$i = "Name"; that would emit a fatal error because the value is
suposed to be an int. This might look a bit too much like java, but as
an extension it could be something quite interesting I believe.
String, Object, Integer, Scalar, Float and what else.
So thinking of something like
$string = new String("Foo");
$string = "bar" or $string->setValue("Bar"); would do
$float = new Float(4.242);
$float->setValue('foobar'); // That emits an error
$float->setValue(3.14159);
echo $float; (__toString) or echo $float->getValue; to echo it's content/value
and so on.
That has got to be the worst idea I've heard on internals for over a month.
Besides, you can do this in userland already anyway:
<?php
class InvalidTypeException extends Exception {}
class UnknownTypeException extends Exception {}
class Types {
const INTEGER = 1;
const FLOAT = 2;
const STRING = 3;
const OBJECT = 4;
const BOOLEAN = 5;
private $val, $type;
public function __construct($val, $type) {
$this->type = $type;
$this->setValue($val);
}
public function setValue($val) {
switch($this->type) {
case self::INTEGER:
if (!is_int($val)) {
throw new InvalidTypeException;
}
break;
case self::FLOAT:
if (!is_float($val)) {
throw new InvalidTypeException;
}
break;
case self::STRING:
if (!is_string($val)) {
throw new InvalidTypeException;
}
break;
case self::OBJECT:
if (!is_object($val)) {
throw new InvalidTypeException;
}
break;
case self::BOOLEAN:
if (!is_bool($val)) {
throw new InvalidTypeException;
}
break;
default:
throw new UnknownTypeException;
}
$this->val = $val;
}
public function getValue() {
return $this->val;
}
public function __toString() {
return (string)$this->getValue();
}
}
class Integer extends Types {
public function __construct($val) {
parent::__construct($val, Types::INTEGER);
}
}
class String extends Types {
public function __construct($val) {
parent::__construct($val, Types::STRING);
}
}
class Float extends Types {
public function __construct($val) {
parent::__construct($val, Types::FLOAT);
}
}
class Object extends Types {
public function __construct($val) {
parent::__construct($val, Types::OBJECT);
}
}
class Boolean extends Types {
public function __construct($val) {
parent::__construct($val, Types::BOOLEAN);
}
}
function type_hint_integer(Integer $val) {
echo $val, "\n";
}
function type_hint_string(String $val) {
echo $val, "\n";
}
function type_hint_float(Float $val) {
echo $val, "\n";
}
type_hint_integer(new Integer(123));
type_hint_string(new String("string"));
type_hint_float(new Float(0.25));
-Hannes