diff --git src/wp-admin/includes/class-wp-plugin-install-list-table.php src/wp-admin/includes/class-wp-plugin-install-list-table.php
index a19729b1d4..607b9389a8 100644
--- src/wp-admin/includes/class-wp-plugin-install-list-table.php
+++ src/wp-admin/includes/class-wp-plugin-install-list-table.php
@@ -496,6 +496,14 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 				$author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '</cite>';
 			}
 
+			$wp_version = get_bloginfo( 'version' );
+
+			$tested_php     = ! empty( $plugin['requires_php'] );
+			$compatible_php = ( ! $tested_php || version_compare( substr( PHP_VERSION, 0, strlen( $plugin['requires_php'] ) ), $plugin['requires_php'], '>=' ) );
+			$tested_wp      = ( empty( $plugin['tested'] ) || version_compare( substr( $wp_version, 0, strlen( $plugin['tested'] ) ), $plugin['tested'], '<=' ) );
+			$compatible_wp  = ( empty( $plugin['requires'] ) || version_compare( substr( $wp_version, 0, strlen( $plugin['requires'] ) ), $plugin['requires'], '>=' ) );
+			$can_install    = ( ! $tested_php || $compatible_php ) && $compatible_wp;
+
 			$action_links = array();
 
 			if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {
@@ -504,15 +512,22 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 				switch ( $status['status'] ) {
 					case 'install':
 						if ( $status['url'] ) {
-							$action_links[] = sprintf(
-								'<a class="install-now button" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
-								esc_attr( $plugin['slug'] ),
-								esc_url( $status['url'] ),
-								/* translators: %s: plugin name and version */
-								esc_attr( sprintf( __( 'Install %s now' ), $name ) ),
-								esc_attr( $name ),
-								__( 'Install Now' )
-							);
+							if ( $can_install ) {
+								$action_links[] = sprintf(
+									'<a class="install-now button" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
+									esc_attr( $plugin['slug'] ),
+									esc_url( $status['url'] ),
+									/* translators: %s: plugin name and version */
+									esc_attr( sprintf( __( 'Install %s now' ), $name ) ),
+									esc_attr( $name ),
+									__( 'Install Now' )
+								);
+							} else {
+								$action_links[] = sprintf(
+									'<button type="button" class="button button-disabled" disabled="disabled">%s</button>',
+									_x( 'Cannot Install', 'plugin' )
+								);
+							}
 						}
 						break;
 
@@ -665,15 +680,19 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 				</div>
 				<div class="column-compatibility">
 					<?php
-					$wp_version = get_bloginfo( 'version' );
-
-					if ( ! empty( $plugin['tested'] ) && version_compare( substr( $wp_version, 0, strlen( $plugin['tested'] ) ), $plugin['tested'], '>' ) ) {
+					if ( ! $tested_wp ) {
 						echo '<span class="compatibility-untested">' . __( 'Untested with your version of WordPress' ) . '</span>';
-					} elseif ( ! empty( $plugin['requires'] ) && version_compare( substr( $wp_version, 0, strlen( $plugin['requires'] ) ), $plugin['requires'], '<' ) ) {
+					} elseif ( ! $compatible_wp ) {
 						echo '<span class="compatibility-incompatible">' . __( '<strong>Incompatible</strong> with your version of WordPress' ) . '</span>';
 					} else {
 						echo '<span class="compatibility-compatible">' . __( '<strong>Compatible</strong> with your version of WordPress' ) . '</span>';
 					}
+					if ( ! $compatible_php ) {
+						echo '<br><span class="compatibility-incompatible">' .
+						__( '<strong>Incompatible</strong> with your version of PHP' ) . '</span>';
+					} elseif ( $tested_php ) {
+						echo '<br><span class="compatibility-compatible">' . __( '<strong>Compatible</strong> with your version of PHP' ) . '</span>';
+					}
 					?>
 				</div>
 			</div>
diff --git src/wp-admin/includes/plugin-install.php src/wp-admin/includes/plugin-install.php
index f765fb286e..a22e707e38 100644
--- src/wp-admin/includes/plugin-install.php
+++ src/wp-admin/includes/plugin-install.php
@@ -753,10 +753,23 @@ if ( ! empty( $api->contributors ) ) {
 	<?php
 	$wp_version = get_bloginfo( 'version' );
 
-	if ( ! empty( $api->tested ) && version_compare( substr( $wp_version, 0, strlen( $api->tested ) ), $api->tested, '>' ) ) {
-		echo '<div class="notice notice-warning notice-alt"><p>' . __( '<strong>Warning:</strong> This plugin has <strong>not been tested</strong> with your current version of WordPress.' ) . '</p></div>';
-	} elseif ( ! empty( $api->requires ) && version_compare( substr( $wp_version, 0, strlen( $api->requires ) ), $api->requires, '<' ) ) {
-		echo '<div class="notice notice-warning notice-alt"><p>' . __( '<strong>Warning:</strong> This plugin has <strong>not been marked as compatible</strong> with your version of WordPress.' ) . '</p></div>';
+	$tested_php     = ! empty( $api->requires_php );
+	$compatible_php = ( ! $tested_php || version_compare( substr( PHP_VERSION, 0, strlen( $api->requires_php ) ), $api->requires_php, '>=' ) );
+	$tested_wp      = ( empty( $api->tested ) || version_compare( substr( $wp_version, 0, strlen( $api->tested ) ), $api->tested, '<=' ) );
+	$compatible_wp  = ( empty( $api->requires ) || version_compare( substr( $wp_version, 0, strlen( $api->requires ) ), $api->requires, '>=' ) );
+	$can_install    = ( ! $tested_php || $compatible_php ) && $compatible_wp;
+
+	if ( ! $tested_wp ) {
+		echo '<div class="notice notice-warning notice-alt"><p>' . __( '<strong>Warning:</strong> This plugin <strong>has not been tested</strong> with your current version of WordPress.' ) . '</p></div>';
+	} elseif ( ! $compatible_wp ) {
+		echo '<div class="notice notice-error notice-alt"><p>' . __( '<strong>Error:</strong> This plugin <strong>has not been marked as compatible</strong> with your version of WordPress.' ) . '</p></div>';
+	}
+	if ( ! $compatible_php && $tested_php ) {
+		echo '<div class="notice notice-error notice-alt"><p>' . sprintf(
+			/* translators: Upgrading PHP page URL */
+			__( '<strong>Error:</strong> This plugin <strong>requires a newer version of PHP</strong>, so unfortunately you cannot install it. <a href="%s">Click here to learn more about upgrading PHP.</a>' ),
+			esc_url( __( 'https://wordpress.org/support/upgrade-php/' ) )
+		) . '</p></div>';
 	}
 
 	foreach ( (array) $api->sections as $section_name => $content ) {
@@ -779,8 +792,13 @@ if ( ! empty( $api->contributors ) ) {
 		$status = install_plugin_install_status( $api );
 		switch ( $status['status'] ) {
 			case 'install':
-				if ( $status['url'] ) {
+				if ( $can_install ) {
 					echo '<a data-slug="' . esc_attr( $api->slug ) . '" id="plugin_install_from_iframe" class="button button-primary right" href="' . $status['url'] . '" target="_parent">' . __( 'Install Now' ) . '</a>';
+				} else {
+					printf(
+						'<button type="button" class="button button-primary button-disabled right" disabled="disabled">%s</button>',
+						_x( 'Cannot Install', 'plugin' )
+					);
 				}
 				break;
 			case 'update_available':
