You see it wrong. You do not want to redirect the request to the .php file to a clean address, because you never want the user to see the .php in the first place. Instead, you need to take a request that does not end with .php, and then check if the file (under the surface) really has the .php extension. Then, if so, calmly rewrite the request to add the .php extension so that the user never sees the extension.
Try the following:
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /$1.php [QSA]
RewriteCond , ( DOCUMENT_ROOT) ".php" . , RewriteRule , ".php" . QSA mod_rewrite , GET .
, DOCUMENT_ROOT , $1 RewriteCond.
, mod_rewrite , , mod_rewrite .