Это означает, что вы либо используете одно и то же имя функции / класса дважды, и вам нужно переименовать один из них, или это потому, что вы использовали require
или include
, где вы должны использовать require_once
или include_once
.
Когда класс или функция объявляется в PHP, он неизменен и не может быть позже объявлен с новым значением.
Рассмотрим следующий код:
class.php
<?php
class MyClass
{
public function doSomething()
{
// do stuff here
}
}
index.php
<?php
function do_stuff()
{
require 'class.php';
$obj = new MyClass;
$obj->doSomething();
}
do_stuff();
do_stuff();
Второй вызов do_stuff()
приведет к получению ошибка выше. Изменяя require
на require_once
, мы можем быть уверены, что файл, содержащий определение MyClass
, будет загружен только один раз, и ошибка будет устранена.
Хиндли-Milner система типов обнаружен независимо Roger Hindley (кто смотрел на логику), и позже Robin Milner (кто смотрел на языки программирования). Преимущества Хиндли-Milner
, Это поддерживает полиморфный функции; например, функция, которая может дать Вам длину списка, независимого от типа элементов или функции, делает поиск двоичного дерева, независимый от типа ключей, сохраненных в дереве.
Иногда функция или значение могут иметь больше чем один тип , как в примере функции длины: это может быть "список целых чисел к целому числу", "список строк к целому числу", "список пар к целому числу", и так далее. В этом случае преимущество сигнала системы Хиндли-Milner состоит в том, что каждый хорошо введенный термин имеет уникальный "лучший" тип , который называют основной тип . Основной тип функции длины списка "для любого a
, функция из списка a
к целому числу". Здесь a
так называемый "параметр типа", который является явный в лямбда-исчислении , но неявный на большинстве языков программирования . Использование параметров типа объясняет, почему Хиндли-Milner является системой, которая реализует параметрический полиморфизм . (Если Вы пишете определение функции длины в ML, Вы видите параметр типа таким образом:
fun 'a length [] = 0
| 'a length (x::xs) = 1 + length xs
, Если термин сделал, чтобы Хиндли-Milner ввел, то основной тип может быть выведен, не требуя никаких описаний типа или другие аннотации программиста. (Это - палка о двух концах, как любой может засвидетельствовать, кто когда-либо обрабатывался большой блок кода ML без аннотаций.)
Хиндли-Milner является основанием для системы типов почти каждого функционального языка со статическим контролем типов. Такие широко использующиеся языки включают
, Все эти языки расширили Хиндли-Milner; Haskell, Чистые, и Объективные Caml делают так амбициозными и необычными способами. (Расширения требуются, чтобы иметь дело с изменяемыми переменными, так как основной Хиндли-Milner может ниспровергаться с помощью, например, изменяемую ячейку, содержащую список значений неуказанного типа. С такими проблемами имеет дело расширение, названное ограничение значения.)
Много других незначительных языков и инструментов на основе введенных функциональных языков используют Хиндли-Milner.
Хиндли-Milner является ограничением система F , которая позволяет больше типов, но которая требует аннотаций программиста .
Можно быть в состоянии найти исходные бумаги с помощью Google Scholar или CiteSeer - или локальная университетская библиотека. Первое является достаточно взрослым, что Вам, вероятно, придется найти связанные копии журнала, я не мог найти его онлайн. Связь, которую я нашел для другого, была разорвана, но могли бы быть другие. Вы, конечно, будете в состоянии найти бумаги, которые цитируют их.
Хиндли, Roger J, основная схема типа объекта в комбинаторной логике , Транзакции американского Математического Общества, 1969.
Milner, Robin, Теория А Полиморфизма Типа , Журнал Компьютерных и Системных Наук, 1978.