Delete file from server (php function)
Yes, clearly you should write D.R.Y. code by not writing multiple methods that perform the same task.

You only need one image_path() and one destroy() method, it is the data delivery to those methods that needs to change and then of course the methods need to be altered to iterate the data.

If you expect to be handing multiple files the same way, I recommend a class variable (array of filenames) which can be filled as necessary, then iterated by your methods.

This mean doing away with:

public $filename;
public $filename2;


and instead use:

public $filenames = [];


A final note about reducing syntax:

if($this-&gt;delete()) {
    $target_path = PUBLIC_PATH.DS.'public'.DS.$this-&gt;image_path();
    return unlink($target_path) ? true : false;
} else {
    return false;
}


Can be rewritten as:

if (!$this-&gt;delete()) {
    return false;
}
return unlink(PUBLIC_PATH . DS . 'public' . DS . $this-&gt;image_path());


or even shorter if you prefer inline conditions:

return !$this-&gt;delete() ? false : unlink(PUBLIC_PATH . DS . 'public' . DS . $this-&gt;image_path());


That said, there is nothing wrong with if blocks, but your ? true : false is unnecessary, I try to avoid declaring  single-use variables, and I prefer to write failure / false / early returns before positive outcomes.