Нет необходимости набирать приведение в php.
Редактировать: Поскольку эта тема, кажется, вызывает некоторую путаницу, я подумал, что немного уточню.
В таких языках, как Java, есть две вещи, которые могут иметь тип. Компилятор имеет представление о типе, а время выполнения - другое представление о типах. Типы компиляторов привязаны к переменным, тогда как механизм времени выполнения отслеживает тип значений (которые назначаются переменным). Типы переменных известны во время компиляции, тогда как типы значений известны только во время выполнения.
Если часть входного кода нарушает систему типов компиляторов, компилятор прервет компиляцию. Другими словами, невозможно скомпилировать фрагмент кода, который нарушает статическую систему типов. Это ловит определенный класс ошибок. Например, возьмем следующий фрагмент (упрощенного) кода Java:
class Alpha {}
class Beta extends Alpha {
public void sayHello() {
System.out.println("Hello");
}
}
Если бы мы сейчас это сделали:
Alpha a = new Beta();
все будет в порядке, поскольку Beta
является подклассом Alpha
и, следовательно, допустимым значением для переменной a
типа Alpha
. Однако, если мы продолжим делать:
a.sayHello();
Компилятор выдаст ошибку, поскольку метод sayHello
не является допустимым методом для Alpha
- Несмотря на то, что мы знаем, что a
на самом деле Beta
.
Введите тип кастинга:
((Beta) a).sayHello();
Здесь мы сообщаем компилятору, что переменная a
в этом случае должна рассматриваться как Beta
. Это известно как приведение типа. Эта лазейка очень полезна, потому что она допускает полиморфизм в языке, но, очевидно, она также является задним ходом для всех видов нарушений системы типов. Поэтому, чтобы обеспечить безопасность типов, существуют некоторые ограничения; Вы можете приводить только к типам, которые связаны между собой. Например. вверх или вниз по иерархии. Другими словами, вы не сможете привести в совершенно не связанный класс Charlie
.
Важно отметить, что все это происходит в компиляторе - то есть это происходит еще до того, как код запускается. Java все еще может войти, чтобы запустить ошибки типа времени. Например, если вы сделали это:
class Alpha {}
class Beta extends Alpha {
public void sayHello() {
System.out.println("Hello");
}
}
class Charlie extends Alpha {}
Alpha a = new Charlie();
((Beta) a).sayHello();
Приведенный выше код действителен для компилятора, но во время выполнения вы получите исключение, поскольку приведение от Beta
к Charlie
несовместимо.
А пока вернемся на PHP-ферму.
Следующее действительно для PHP-компилятора - оно с радостью превратит это в исполняемый байт-код, но вы получите ошибку времени выполнения:
class Alpha {}
class Beta extends Alpha {
function sayHello() {
print "Hello";
}
}
$a = new Alpha();
$a->sayHello();
Это потому, что переменные PHP не имеют типа. Компилятор не знает, какие типы времени выполнения допустимы для переменной, поэтому он не пытается применять ее. Вы также не указываете тип явно, как в Java. Да, есть подсказки типа, но это просто контракты во время выполнения. Следующее еще действует:
// reuse the classes from above
function tellToSayHello(Alpha $a) {
$a->sayHello();
}
tellToSayHello(new Beta());
Несмотря на то, что переменные в PHP не имеют типов, значения все еще сохраняются. Особый интересный аспект PHP заключается в том, что можно изменить тип значения. Например:
// The variable $foo holds a value with the type of string
$foo = "42";
echo gettype($foo); // Yields "string"
// Here we change the type from string -> integer
settype($foo, "integer");
echo gettype($foo); // Yields "integer"
Эту особенность иногда путают с приведением типов, но это неправильно. Тип по-прежнему является свойством значения, и смена типа происходит во время выполнения, а не во время компиляции.
Возможность изменять тип также довольно ограничена в PHP. Изменить тип можно только между простыми типами, а не объектами. Таким образом, невозможно изменить тип с одного класса на другой. Вы можете создать новый объект и скопировать состояние, но изменить тип невозможно. PHP в этом отношении немного посторонний; Другие подобные языки рассматривают классы как гораздо более динамичную концепцию, чем PHP.
Другая похожая особенность PHP заключается в том, что вы можете клонировать значение как новый тип, например так:
// The variable $foo holds a value with the type of string
$foo = "42";
echo gettype($foo); // Yields "string"
// Here we change the type from string -> integer
$bar = (integer) $foo;
echo gettype($bar); // Yields "integer"
Синтаксически это очень похоже на то, как пишется типизация на статически типизированных языках. Поэтому его также часто путают с приведением типов, хотя это все еще преобразование типов во время выполнения.
Подводя итог: Приведение типов - это операция, которая изменяет тип переменной ( не значение). Поскольку в PHP переменные не имеют типа, это не только невозможно, но и бессмысленно спрашивать.