Se puede considerar una mala práctica, sí. En realidad es una especie de reglas a seguir sobretodo cuando trabajas con más personas y cuando das tu código a otras personas. También es por tema de funcionalidad y mantenimiento. Supongamos que tienes la siguiente clase:
Código PHP :
class Person {
public $name;
public $surname;
public function __construct($name, $surname) {
$this->name = $name;
$this->surname = $surname;
}
}
Y tú piensas "este código solo lo voy a ver yo y nadie más" y no usas métodos accesores por eso mismo. Pero resulta que un tiempo más tarde tienes que ampliar tu código para añadir una propiedad que almacene el nombre completo. Por supuesto, si cambias el nombre debe cambiarse esa propiedad. Entonces ahí se te complica la cosa, pues tendrías que crear un método aparte que llene el nombre completo y llamarlo después de modificar el nombre:
Código PHP :
$persona->name = "Pepito";
$persona->renewFullName();
Esto, al fin y al cabo, se hace poco práctico, por ello es mejor que permanezca unificado para que cada vez que modificas el nombre uses una sola sentencia, y no dos. El siguiente código sería más práctico en ese sentido:
Código PHP :
class Person {
private $name;
private $surname;
private $fullName;
public function __construct($name, $surname) {
$this->name = $name;
$this->surname = $surname;
$this->renewFullName();
}
public function setName($name) {
this->name = $name;
$this->renewFullName();
}
public function renewFullName() {
$this->fullName = $this->name . " " . $this->surname;
}
}
De esta forma, en cuanto introduzcas el nuevo nombre se cambiará también el nombre completo. Como mencioné antes, usar los métodos te permite hacer tareas intermedias como esta, o como guardar el nombre en una base de datos. Es uno de los objetivos de la POO, que sea modular. Realmente cuando usas un método set/get no importa lo que pase por dentro de ese método, solo que lo haga. Lo que haces es tratar dicho valor o hacer lo que sea que te convenga que hacer.
Este ejemplo también vale para explicar lo de que se pueda "romper" tu aplicación. Supón que haces una clase como esa y se la das a un compañero para que trabaje con ella. ¿Qué pasa si usa $persona->name para acceder al nombre porque se le hace más cómodo? Que posteriormente no se cambia el nombre completo, y fullName conservaría el nombre antiguo.
Imagina que tienes puesto que te llamas "Pepe Vega" y te cambias el nombre por "Pepito". Si después tienes que mostrar el nombre completo va a seguir siendo "Pepe Vega" en lugar de "Pepito Vega". En este caso es un nombre, pero en clases más complejas puede significar que el programa se rompa y de error. Ese es el motivo principal por el que las propiedades sean privadas, para que no se pueda acceder de forma directa a su valor.
Al final del día tienes ambas formas de acceder al valor de la propiedad(si las pones públicas). Queda en tu decisión si hacerlo a tu manera o seguir mejores prácticas para que en el futuro todos se entiendan mejor con tu código, y tú entiendas el de los demás, sobretodo en el trabajo en grupo, y por supuesto que no haya problemas.