Можно определить почти все функции mysql_ *, используя mysqli или PDO. Просто включите их поверх своего старого PHP-приложения, и он будет работать на PHP7. Мое решение здесь .
length : false;
}
function mysql_field_name($qlink, $offset) {
$field = mysqli_fetch_field_direct($qlink, $offset);
if (!is_object($field))
return false;
return empty($field->orgname) ? $field->name : $field->orgname;
}
function mysql_field_table($qlink, $offset) {
$field = mysqli_fetch_field_direct($qlink, $offset);
if (!is_object($field))
return false;
return empty($field->orgtable) ? $field->table : $field->orgtable;
}
function mysql_field_type($qlink, $offset) {
$field = mysqli_fetch_field_direct($qlink, $offset);
return is_object($field) ? $field->type : false;
}
function mysql_free_result($qlink) {
try {
mysqli_free_result($qlink);
} catch (Exception $e) {
return false;
}
return true;
}
Наследие. Список изначально был определен как функционально-язычный:
1 :: 2 :: Nil // a list
list1 ::: list2 // concatenation of two lists
list match {
case head :: tail => "non-empty"
case Nil => "empty"
}
Конечно, Scala разработала другие коллекции специальным образом. Когда вышел 2.8, коллекции были переработаны для максимального повторного использования кода и согласованного API, так что вы можете использовать ++
для объединения любых двух коллекций и даже итераторов. Однако список должен содержать своих первоначальных операторов, кроме одного или двух, которые устарели.
Другая точка состоит в том, что первое предложение анализируется как:
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
. В то время как второй пример анализируется как:
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
Итак, если вы используете макросы, вы должны позаботиться.
Кроме того, ++
для двух списков вызывает :::
, но с большим количеством служебных данных, потому что он просит неявное значение иметь построитель из списка в список. Но микробенчмарки не показали ничего полезного в этом смысле, я думаю, что компилятор оптимизирует такие вызовы.
Micro-Benchmarks после разогрева.
scala>def time(a: => Unit): Long = { val t = System.currentTimeMillis; a; System.currentTimeMillis - t}
scala>def average(a: () => Long) = (for(i<-1 to 100) yield a()).sum/100
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ++ List(e) } })
res1: Long = 46
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ::: List(e ) } })
res2: Long = 46
Как сказал Дэниел С. Собрай , вы можете добавить содержимое любой коллекции в список, используя ++
, тогда как с :::
вы можете только конкатенировать списки.
:::
работает только со списками, а ++
может использоваться с любым проходящим. В текущей реализации (2.9.0) ++
возвращается на :::
, если аргумент также является List
.
Всегда используйте :::
. Существует две причины: эффективность и безопасность типов.
Эффективность
x ::: y ::: z
быстрее, чем x ++ y ++ z
, поскольку :::
является правильной ассоциативной. x ::: y ::: z
анализируется как x ::: (y ::: z)
, который алгоритмически быстрее, чем (x ::: y) ::: z
(последний требует O (| x |) дополнительных шагов).
Тип безопасности
С :::
вы можете конкатенировать только два List
s. С помощью ++
вы можете добавить любую коллекцию в List
, что ужасно:
scala> List(1, 2, 3) ++ "ab"
res0: List[AnyVal] = List(1, 2, 3, a, b)
++
также легко смешивается с +
:
scala> List(1, 2, 3) + "ab"
res1: String = List(1, 2, 3)ab