The specific issue is that PHP snippets won't trigger at EOF, because the selector won't match there (the reported scope is always text.html.basic at EOF in a PHP file). I'll fix this for the next build.
The rules for when snippet fields are cancelled aren't great from a usability POV: they appear to stick around for too long. There's good reasons for why they act like they do, but it's something I need to address. In the mean time you can press escape to cancel all the snippet fields.
It's coming, but in the mean time there's a way to create a file in a specific directory: when creating a new file via Ctrl+N, it'll save by default to the directory of the last file you used. Open a file in the directory of interest, then hit Ctrl+N, then Ctrl+S, and you'll be in the right spot.
When I first implemented it, snippets used fuzzy matching on the tab trigger. I didn't particularly like it, because I kept getting snippets unexpectedly inserted when I was just trying to complete a word. I think there's some justification for this: snippets already tend to have short tab triggers, and a snippet often isn't really a word completion target, but a code generation mnemonic.
For example, if I have a python function with a function called 'classify', it's likely typing cls,tab means I want to insert 'classify', rather than generate a class template.