I would suggest providing a protected path() member function in A, and then override this in B and then in C.
Unfortunately, I noticed:
$class->two(); // Not in class C, needs to use class B dir path
The comment is incorrect. two() is a member function of class C. It just was not overriden. Consequently, if you use my suggestion, the path obtained would be from C, not B.
As such, I think your best option is to pass the path as an argument since polymorphism would not work.