Чем чревато использование модификатора public?
чем же всё-таки на реальном примере чревато использование publicНу смотри.
Представь себе, что ты - объект, а все твои свойства (сердце, печень, желудок) -  публичные. Я могу к тебе подойти, тыкнуть пальцем в сердце и ты помрешь. Так же и в объектах - те свойства, которые ответственны за работоспособность объекта класса, которые не должны быть доступны извне, делают private/protected. 

Как в закрытое свойств (желудок) поместить еду? Сделаем публичный метод ЕСТЬ(), который поместит туда еду. На вход подаем пищу. 
Зачем нужен метод, если, теоретически, желудок можно было бы сделать public и класть в него пищу напрямую, с помощью лопаты? Очевидно, метод ЕСТЬ() имеет кое-какую проверку входящих данных. Например, если ты засунешь себе в рот тухлятину, то эта "еда" просто не пойдет дальше - сработает рвотный рефлекс.
Такая же аналогия с программированием - хорошая практика - делать т.н. сеттеры/геттеры методы, которые принимают и возвращают свойства объектов. На эти методы можно повесть некую логику. Например, при установки свойства проверять его корректность, а при возвращении - отдавать в определенном формате.

Когда нужны public-свойства? В очень редких случаях, например когда объект выполняет роль некого хранилища, например это \stdClass -объект верхнего уровня PHP. Но в реальной разработке это очень редкие явления. 
Все классы должны иметь закрытые свойства, а для манипуляции с ними - геттеры/сеттеры. Это хорошая практика.

Ну и пример банальный: 

// класс для работы с mysql
class Database
{
    /**
     * Ресурс соединения с mysql 
     * @var mysqli
     */
    public $connection;

    public function __construct()
    {
        $this->connection = mysqli_connect(/**/);
    }
}

$db = new Database();

// какой-то петя в коде написал случайно:
$db->connection = 123; // все сломалось
Простой пример:

class Foo
{
	public $quux;
}

class Bar
{
	private $quux;

	public function setQuux(Quux $quux)
	{
		$this->quux = $quux;
	}
}

class Quux
{
}

$foo = new Foo();
$foo->quux = 'text';  // Work

$foo = new Bar();
$foo->quux = 'text'; // Member has private access

Свойство quux является public свойством класса Foo. При таком подходе можно манипулировать ним как угодно и хранить там любые данные.

С появлением типизированных свойств (PHP 7.4) - можно не использовать сеттеры:

class Foo
{
	public Quux $quux;
}

А что, если в классе есть свойство, которое не должно быть изменено? Идея в том, что класс должен предоставлять API для работы с ним, чтобы исключить возможность сломать логику его работы.

Closing the API allows design flaws to be found more easily and gives you the opportunity to evolve your code by creating well defined extension points.

fabien.potencier.org/pragmatism-over-theory-protec...