PhpStorm 2016.3 Help

Move Refactorings

In this section:

Move refactorings: basics

The Move refactorings allow you to move classes, static members (methods, variables, and constants), files and directories within a project. So doing, PhpStorm tracks these movements and automatically corrects all references to the moved symbols in the source code.

The following Move refactorings are available:

  • The Move File refactoring moves a file to another directory.
  • The Move Directory refactoring moves a directory to another directory.
  • The Move Class refactoring moves a PHP class to another existing namespace or creates a new one and moves the class to it.
  • The Move Static Member refactoring moves a static method, variable, or constant from one class to another.

Moving a file or a directory to another directory

To move a file or directory to another directory, follow these steps:

  1. Select the file or directory in the Project tool window.
  2. Do one of the following:
    • On the main menu or the context menu of the selection, choose Refactor, and then choose Move.
    • Press F6.

    The dialog that opens depends on the type of the selected symbol.

  3. In the To directory field, specify the folder to move the selected file or folder to. Choose an existing folder from the drop-down list or type the full path to the parent folder to be created.
  4. To have the references to the selected file or folder updated according to the refactoring result, select the Search for references check box.

Moving a PHP namespace

PhpStorm supposes that the namespaces in your project are arranged in compliance with the PSR0 standard and enforces you to retain the folder structure and the namespace hierarchy in accordance with this standard when moving namespaces.

When you specify a namespace to move a namespace to, PhpStorm automatically updates the Target Destination Directory field, which shows the path to the folder that corresponds to the namespace in question.

To move a namespace with all or some of its related classes to another namespace:

  1. In the editor, place the caret at the namespace to move and choose Refactor | Move on the main menu or on the context menu of the selection. Note that if you select the folder that corresponds to the required namespace in the Project tool window and then choose Refactor | Move, the Move Directory refactoring will be invoked.
  2. In the Move Namespace Dialog that opens, specify the new namespace name and the folder that will correspond to it.
    1. The New Namespace Name field shows the fully qualified name of the selected namespace. Specify the new namespace name. Use only backslashes (\) as namespace separators.
    2. When the dialog box opens, the Target Destination Directory field shows the path to the folder which corresponds to the current namespace.

      The path is displayed in the format ...\<project root folder>\<path to the current namespace folder relative to the project root>. The path is updated automatically as you specify the new namespace name. However, if you are going to move a namespace to another parent namespace, PhpStorm will not suggest the proper folder unless you appoint a root folder for your namespace structure by marking the relevant folder as Sources on the Directories page of the Settings dialog box, see Directories for details.

      Do one of the following:

      • Accept the preselected path displayed in the field.
      • Choose another path from the list. All of them are evaluated from the namespace root or from the current directory, so it is safe to choose any of them.
      • Click /help/img/idea/2016.3/browseButton.png and select a folder in the dialog box that opens.
      • Press F2 and edit the preselected path. Keep in mind that this may cause problems with automatic loading in the future.

  3. Click Refactor and in the Move Files with Related Namespaces dialog box that opens specify the classes and files to be moved to the new namespace and the new folder.

    The upper pane of the dialog box lists the destination namespaces and folders for classes and files related to the namespace in question. Each item in the list corresponds to a class/file. When you move the cursor to an item, the bottom pane shows the contents of the file related with it.

    /help/img/idea/2016.3/ps_move_namespace_refactoring_move_files_dialog.png

    • To have a class and the corresponding file moved to the destination namespace and the destination folder, select the check box next to the namespace/folder.
    • To add all the items to the list or remove all of them from the list, click Select All or Unselect All respectively.
  4. Click OK to start the refactoring.

Moving a static PHP method, variable, or constant to another class

To move a static PHP method, variable, or constant to another class, follow these steps:

  1. Open a PHP class in the editor and select a static method, variable, or constant or just position the cursor at it.
  2. On the context menu of the selection or on the main menu, choose Refactor | Move.
  3. In the Move Static Member Dialog that opens, specify the following:
    1. In the Members to be moved to another class field, select the check boxes next to the methods, constants, and variables that you want to move to another class. The list shows all the static methods, variables, and constants detected in the current class.
    2. In the Move Member To Class text box, type the fully qualified name of the class where you want to move the members selected in the Members to be moved to another class list. PhpStorm provides completion for the class and namespace reference: as you type a class or namespace name, a suggestion list with the relevant item is displayed. You can also get a full list of available classes by pressing Ctrl+Space.

Moving a class to another namespace

PhpStorm supposes that the namespaces in your project are arranged in compliance with the PSR0 standard and enforces you to retain the folder structure and the namespace hierarchy in accordance with this standard when moving classes among namespaces.

When you specify a namespace to move a class to, PhpStorm automatically updates the Target Destination Directory field, which shows the path to the folder where the file that implements the class in question will be stored.

However, if you are going to move a class to a non-existing namespace under another parent namespace, PhpStorm will not suggest the proper folder unless you appoint a root folder for your namespace structure by marking the relevant folder as Sources on the Directories page of the Settings dialog box, see Directories for details.

To move a class to another namespace, follow these steps:

  1. In the editor, place the caret at the class to move.
  2. Do one of the following:
    • On the main menu or the context menu of the selection, choose Refactor, and then choose Move.
    • Press F6.
  3. In the Move Class dialog box, that opens, specify the namespace to move the class to and the folder where the file that implements the class will be stored.
    1. In the Move Class <class name> to Namespace field, appoint the namespace to move the selected class to. This can be:
      • A new namespace under the current namespace.
      • Another subordinate namespace under the current parent.
      • An existing or a new namespace under another parent.
      In any case, the import statements referencing the class are updated accordingly.
    2. In the Target Destination Directory field, appoint the folder where you want PhpStorm to move the file that implements the class.

      PhpStorm supposes that the namespaces in your project are arranged in compliance with the PSR0 standard and enforces you to retain the folder structure and the namespace hierarchy in accordance with this standard when moving classes among namespaces.

      When you specify a namespace to move a class to, PhpStorm automatically updates the Target Destination Directory field, which shows the path to the folder file that implements the class in question.

      When the dialog box opens, the field shows the path to the folder which corresponds to the current namespace.

      The path is displayed in the format ...\<project root folder>\<path to the current namespace folder relative to the project root>. The path is updated automatically as you specify the new namespace name. However, if you are going to move a namespace to another parent namespace, PhpStorm will not suggest the proper folder unless you appoint a root folder for your namespace structure by marking the relevant folder as Sources on the Directories page of the Settings dialog box, see Directories for details.

      Do one of the following:

      • Accept the preselected path displayed in the field.
      • Choose another path from the list. All of them are evaluated from the namespace root or from the current directory, so it is safe to choose any of them.
      • Click /help/img/idea/2016.3/browseButton.png and select a folder in the dialog box that opens.
      • Press F2 and edit the preselected path. Keep in mind that this may cause problems with automatic loading in the future.

    3. The Move class to a new file check box is selected. Leave this default selection.
  4. Initiate refactoring by clicking Refactor or Preview, for more details, see Refactoring Source Code.

Examples of moving PHP classes

Moving a Class to a New Namespace under the Current Namespace

Suppose, your project move_class has a namespace namespace1 with one class Class1 implemented in the file Class1.php.

ps_move_class_1.png
Let's create a subordinate namespace namespace1\ns1 and move Class1 to it.

  1. Open Class1.php in the editor, position the cursor at Class1, and press F6. The Move Class dialog box opens.
    ps_move_class_2
  2. The Move class Class1 to namespace field shows the current namespace namespace1. Change it to namespace1\ns1.
  3. As you type, the Target destination directory read-only field is updated automatically from ...\move_class\namespace1 to ...\move_class\namespace1\ns1.
    ps_move_class_3
  4. Press Refactor. As a result, PhpStorm creates a new subfolder ns1 and moves the file Class1 to it. Accordingly, the class Class1 is moved to the namespace1\ns1 namespace:
    ps_move_class_4

Moving a Class between Two Namespaces under the Same Parent

Suppose, your project move_class has a namespace namespace1 with two subordinate namespaces namespace1\ns1 and namespace1\ns3. These subordinate namespaces have Class1 Class3 respectively. In accordance with the PSR0 standard, these classes are implemented in the files Class1.php and Class3.php that are stored in the folders ...\move_class\namespace1\ns1 and ...\move_class\namespace1\ns3 respectively.

ps_move_class_5.png
Let's move Class3 from namespace1\ns3 to namespace1\ns1.

  1. Open Class3.php in the editor, position the cursor at Class3, and press F6. The Move Class dialog box opens.
    ps_move_class_6
  2. The Move class Class3 to namespace field shows the current namespace namespace1\ns3. Change it to namespace1\ns1.
  3. As you type, the Target destination directory read-only field is updated automatically from ...\move_class\namespace1\ns3 to ...\move_class\namespace1\ns1.
    ps_move_class_7
  4. Press Refactor. As a result, PhpStorm moves the class Class3 from namespace1\ns3 to namespace1\ns1. Accordingly, the file Class3 is moved from folder ...\move_class\namespace1\ns3 to folder ...\move_class\namespace1\ns1:
    ps_move_class_8

Moving a Class to an Existing Namespace under Another Parent Namespace

Suppose, your project move_class has two parent namespaces namespace1 and namespace2 with subordinate namespaces namespace1\ns1 and namespace2\ns2. Class2 is defined in namespace2\ns2, and in accordance with the PSR0 standard the file Class2.php that implements it is stored in ...\move_class\namespace2\ns2.

ps_move_class_9.png
Let's move Class2 from namespace2\ns2 to namespace1\ns1.

  1. Open Class2.php in the editor, position the cursor at Class2, and press F6. The Move Class dialog box opens.
    ps_move_class_10
  2. The Move class Class2 to namespace field shows the current namespace namespace2\ns2. Change it to namespace1\ns1.
  3. As you type, the Target destination directory read-only field is updated automatically from ...\move_class\namespace2\ns2 to ...\move_class\namespace1\ns1.
    ps_move_class_11
  4. Press Refactor. As a result, PhpStorm moves the class Class2 from namespace2\ns2 to namespace1\ns1. Accordingly, the file Class2 is moved from folder ...\move_class\namespace2\ns2 to folder ...\move_class\namespace1\ns1:
    ps_move_class_12

Moving a Class to a New Namespace Outside the Immediate Parent Namespace

Suppose, your project move_class has two parent namespaces namespace1 and namespace2 with subordinate namespaces namespace1\ns1 and namespace2\ns2. Class2 is defined in namespace2\ns2, and in accordance with the PSR0 standard the file Class2.php that implements it is stored in ...\move_class\namespace2\ns2.

ps_move_class_9.png
Let's move Class2 from namespace2\ns2 to a new namespace namespace3 that does not exist yet. To meet the PSR0 requirements, a new folder ...\move_class\namespace3 for the namespace3 namespace should be also created.

When starting the refactoring we should keep in mind that the new namespace is to be created outside the immediate parent namespace of our class's namespace, therefore PhpStorm will not suggest a proper folder for it. So we can either specify the target folder manually or appoint a root folder for namespaces which will be the starting point for PhpStorm to calculate the folder for the new namespace.

  1. Open Class2.php in the editor, position the cursor at Class2, and press F6. The Move Class dialog box opens.
    ps_move_class_10.png
  2. The Move class Class2 to namespace field shows the current namespace namespace2\ns2. Change it to namespace3. The result depends on whether you have appointed the root folder for your namespaces or not.
    • If no root folder is specified, the Target destination directory field still shows the path to ...\move_class\namespace2\ns2 because PhpStorm cannot calculate the path to the folder for the new namespace namespace3 to be created:
      ps_move_class_13.png

      To solve the problem, press F2 and type the path manually:

      ...\move_class\namespace2\ns2

    • Alternatively, specify the root folder for your namespaces by marking the ...\move_class\ folder as Sources as described in Configuring Folders Within a Content Root. Note, that this should be done before you start the refactoring, so if you have already opened the Move Class dialog box, close it first.

      After you have appointed the ...\move_class\ folder as the root for your namespaces, PhpStorm will calculate the folder for the new namespace and update the Target Destination Directory field automatically:

      ps_move_class_14.png

    • Press Refactor. As a result, PhpStorm moves the class Class2 from namespace2\ns2 to namespace3. Accordingly, the file Class2 is moved from folder ...\move_class\namespace2\ns2 to folder ...\move_class\namespace3:
      ps_move_class_15

See Also

Last modified: 23 March 2017