What are the advantages of using a setter method with preconditions in PHP classes compared to defining a public property directly?

Using a setter method with preconditions in PHP classes allows for better control and validation of the data being set in a property. This helps ensure that the data meets certain criteria before being assigned to the property, improving data integrity and reducing the risk of unexpected behavior. Additionally, setter methods provide a clear interface for modifying the property, making the code more readable and maintainable.

class MyClass {
    private $myProperty;

    public function setMyProperty($value) {
        // Add preconditions here
        if (is_numeric($value)) {
            $this->myProperty = $value;
        } else {
            throw new Exception("Value must be numeric");
        }
    }

    public function getMyProperty() {
        return $this->myProperty;
    }
}

$obj = new MyClass();
$obj->setMyProperty(10);
echo $obj->getMyProperty(); // Output: 10

// Trying to set a non-numeric value will throw an exception
$obj->setMyProperty("abc");