Используйте запрос xpath: //div[@class=\"layout-2-2\"]//a/@href
, чтобы получить атрибуты родительских, дочерних узлов и дочерних узлов.
$html = file_get_contents('https://url/');
$links = [];
$document = new DOMDocument;
$document ->loadHTML($html);
$xPath = new DOMXPath($document );
$anchorTags = $xPath->evaluate("//div[@class=\"layout-2-2\"]//a/@href");
foreach ($anchorTags as $anchorTag) {
$links[] = $anchorTag->nodeValue;
}
print_r($links);
Насколько я знаю:
Equals реализован в объекте и также может быть переопределен. Реализация по умолчанию в Object выполняет сравнение ссылок для ссылочных типов. Так что по умолчанию, Equals и == делают то же самое.
Я думаю, что в Java вы не можете перегружать оператор ==. Но мои знания Java довольно устарели.
Редактировать:
Обратите внимание, что оператор ==
является статическим методом. Он привязан во время компиляции, основывается на типах ваших переменных или полей. Равно
- это виртуальный метод, который находится во время выполнения на основе фактических типов времени выполнения.
В качестве дополнения к превосходный ответ Стефана - еще одно исключение, если в операндах содержится Nullable
- в этом случае применяются операторы «поднятого» (14.2.7 в ECMA 334v4):
Для операторов равенства ==! =
поднятая форма оператора существует, если оба типа операндов ненулевые типы значений и, если тип результата - bool. Поднятая форма построен путем добавления одного? модификатор для каждого типа операнда. поднял оператор считает два ноль значения равны, а нулевое значение неравно к любому ненулевому значению. Если оба операнды ненулевые, поднятые Оператор разворачивает операнды и применяет базовый оператор к создайте результат bool.
Что это означает: потому что есть оператор равенства между (скажем):
int i = ..., j = ...;
bool eq = i == j;
Таким образом, существует неявный оператор вида (хотя и выполняется по-разному):
int? i = ..., j = ...;
bool eq;
if(i.HasValue) {
if(j.HasValue) { // both have values; compare
eq = i.GetValueOrDefault() == j.GetValueOrDefault();
} else { // one null; always false
eq = false;
}
} else { // true if both null, else false
eq = !j.HasValue;
}
Из MSDN :
Для предопределенных типов значений Оператор равенства (==) возвращает true, если значения его операндов равны, ложь в противном случае. Для справочных типов кроме строки, == возвращает true, если два его операнда относятся к одному и тому же объект. Для типа строки == сравнивает значения строк.
Нет ... оператор == не всегда ведет себя одинаково в java и в c #.
Например, со строками; Java == сравнивает ссылки на строковые объекты ... (если вы используете примитивные типы, == в java сравнивает значения). Вот почему
// returns FALSE in JAVA
(new String("test") == "test")
не вернет true в java ...
В отличие от этого, в C # оператор == ведет себя по-разному в строках. Например, он вернет true в следующем случае:
// returns TRUE in C#
(new String("test".ToCharArray()) == "test")
То, что он делает, зависит от контекста.
http://en.csharp-online.net/ECMA-334:_14.9_Relational_and_type-testing_operators
Поведение оператора == зависит от того, как была объявлена переменная, к которой вы его применяете (не от класса объекта, я добавлю пример).
Для типов значений он сравнивает их значения.
Для ссылочных типов a == b возвращает истину, если a является тем же объектом, что и b, если только оператор == не был перегружен. Не переопределяя, как говорили другие, вы не можете переопределить операторы в C #, потому что они не виртуальные.
object obj_a, obj_b;
string str_a, str_b;
str_a = "ABC";
str_b = new string("ABC".ToCharArray());
obj_a = str_a;
obj_b = str_b;
Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded
Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals
Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded
Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed.
Console.ReadKey();
Результатом этой программы будет
str_a == str_b = True str_a.Equals(str_b) = True obj_a == obj_b = False obj_a.Equals(obj_b) = True