Да и в С# всё так же:
using System;
public class A
{
private String value;
public A(String value)
{
this.value = value;
}
public void Method(A otherA)
{
Console.WriteLine(this.value + " " + otherA.value);
}
}
public class Program
{
public static void Main()
{
A a1 = new A("OLOLO");
A a2 = new A("TROLOLO");
a1.Method(a2);
}
}
L!MP, по всей видимости проверка доступа всегда выполняется на уровне класса. Если метод принадлежит тому же классу, что и экземпляр, то доступ разрешается. Если бы так не было, то при наследовании методы родительского класса теряли бы доступ к приватным свойством этого же класса, так как вызывались бы на уровне дочернего объекта
Delphinum, ну да, получается что так. Хотя мне сначала казалось что это какой-то фундаментальный косяк именно РНР.
L!MP, ну вообще это довольно полезный косяк, не нарушающий инкапсуляцию
Delphinum, ну выходит что это и не косяк вовсе. Как он о там, один раз случайность (РНР), два раза - тенденция (JAVA), три раза - закономерность (С#)
# L!MP (09.12.2016 / 19:48)
Delphinum, ну выходит что это и не косяк вовсе. Как он о там, один раз случайность (РНР), два раза - тенденция (JAVA), три раза - закономерность (С#)
Да, теперь вижу.
Это походу и не косяк, а специальная возможность обращаться к приватным свойствам своих копий как к самому себе... Никогда этим не пользовался, но раз пишешь, значит возможность есть.
Хм, чет не могу понять почему такой код начинает работать бесконечно
$iterator = new SplFileObject(__FILE__);
var_dump(iterator_count($iterator));
По сути же должно подсчитать количество элементов в итераторе и показать.
Jahak, потому что итератор ресурс
Koenig, Итератор это итератор и ничем другим он не может быть по моему.
$iterator = new SplFileObject(__FILE__);
var_dump(
is_resource($iterator), // bool(false)
$iterator instanceof Traversable, // bool(true)
$iterator instanceof Iterator // bool(true)
);
Jahak, но этот итератор тебя так не покажет количество строк или символов